Page 1 of 2

Pregunta para el amigo Daniel

Posted: Thu Feb 09, 2012 3:25 pm
by ruben Dario
Saludos

Estoy haciendo un reporte con fastrepor y Tdolhin

tengo cuatro Querin , me genera un error al hacer un filtro

No se que error tengo este es el trozo de codigo para Tdolhin.

El Error que da es
Mysql/1052 Column 'planta' in where clusula in ambiguos
Te anexo el Codigo de Ado que me funciona , como seria para Tdolhin en donde estoy cometiendo el error

Code: Select all

       If ! oQry:Eof()
          cFiltro := " planta = '"+alltrim(oQry:planta)+"' "
          cFiltro += " AND codprod = '"+alltrim(oQry:codprod)+"' "
          cFiltro += " AND verprod = "+alltrim(str(oQry:verprod))
         If ! oQry1:Eof()  > 0 
            oQry1:SetWhere( cFiltro, .T. )
         Endif
         If ! oQry2:Eof()  > 0 
            oQry2:SetWhere( cFiltro, .T. )
         Endif
         If ! oQry3:Eof()  > 0 
            oQry3:SetWhere( cFiltro, .T. )
         Endif
      Else
       Endif

 

Con Ado es asi y me funciona

Code: Select all

      If ! oQry:Eof()
         cFiltro := " planta = '"+alltrim(oQry:Fields("planta"):Value)+"' "
         cFiltro += " AND codprod = '"+alltrim(oQry:Fields("codprod"):Value)+"' "
         cFiltro += " AND verprod = "+alltrim(str(oQry:Fields("verprod"):Value))
        If oQry1:RecordCount() > 0 //! oQry1:Eof()
          oQry1:Filter := 0 
          oQry1:MoveFirst()
          oQry1:Filter := ( cFiltro ) 
        Endif
        If oQry2:RecordCount() > 0 //! oQry2:Eof()
           oQry2:Filter := 0 
           oQry2:MoveFirst()
           oQry2:Filter := ( cFiltro ) 
        Endif
        If oQry3:RecordCount() > 0 //! oQry3:Eof()
           oQry3:Filter := 0 
           oQry3:MoveFirst()
           oQry3:Filter := ( cFiltro ) 
        Endif
     Else
     Endif

 

Re: Pregunta para el amigo Daniel

Posted: Thu Feb 09, 2012 5:50 pm
by Daniel Garcia-Gil
Hola

puedes copiar aqui el query original que quieres tratar de cambiar, si es un query complejo, es decir, que involucra mas de una tabla, hay una tecnica diferente y bastante facil de usar

Re: Pregunta para el amigo Daniel

Posted: Thu Feb 09, 2012 7:07 pm
by ruben Dario
Gracias Daniel

Te copio todo el codigo para fastreport , este mismo me funciona con ADO , el problema que tengo con la relacion de tablas uso cuatro. en PROCEDURE DETE_PROD es donde tengo el problema

La relacion entre tablas sewria oQry:planta , oQry:codprod , oQry:verprod este es el problema que tengo


Te cuento ya pase todo mi proyecto a Tdolphin genial su clase.

Code: Select all


  cSelect := "SELECT A1.codcia,A1.tipdoc,A1.codprov,A1.codprod,A1.verprod,A1.consec,A1.simbolo,A1.referencia "+;
"  FROM product AS A1 ORDER BY A1.codprov ASC, A1.codprod ASC, A1.verprod ASC "

oDbf := oApp:oServer:Query(cSelect)

cSelect := "SELECT A1.codcia,A1.planta,A1.codprod,A1.verprod,A1.tippro,A1.hor_cor,A1.hor_ali,A1.mts_min  "+;
"  FROM prodtiem AS A1 ORDER BY A1.planta ASC,A1.codprod ASC,A1.verprod ASC, A1.tippro ASC "

oDbf01:= oApp:oServer:Query(cSelect)

cSelect := "SELECT A1.codcia,A1.tipdoc,A1.planta,A1.codprov,A1.codprod,A1.verprod,A2.tippro,A2.mezc,A2.codmat,A2.tipo "+;
"FROM product AS A1  ORDER BY A1.planta ASC,A1.codprod ASC,A2.mezc ASC "
oDbf02 := oApp:oServer:Query(cSelect)

cSelect:= "SELECT A1.codcia,A1.tipdoc,A1.planta,A1.numorden,A1.codprod,A1.verprod,A1.codprov,A1.consec,A1.ordcom,"+;
"A21.nombre AS nombre_tipped,A22.nombre AS nombre_gmat1,A23.nombre AS nombre_mat1,A23.nombre1 AS nombre_mat2c "+;
"FROM pedidos AS A1 "+;

oDbf03 := oApp:oServer:Query(cSelect)


oFrP := frReportManager():new()

aBlock := {|| DETE_PROD( oDbf, oDbf01, oDbf02, oDbf03 ) } 

MAKEDATASET( oFrP, "Productos", oDbf,aBlock )
MAKEDATASET( oFrP, "Materiales", oDbf01) //, bBlock
MAKEDATASET( oFrP, "Tiempos", oDbf02 )
MAKEDATASET( oFrP, "Historia", oDbf03)

def_Varfastr(oFrP,::DGRUPO,"rep_pxp050_1a")

def_Desigfasr(oFrP)


*-------

Static Function def_Varfastr(oFrP,DGRUPO,LMOD)
with object oFrP 
:LoadLangRes( "Spanish.xml" )
:SetIcon(9001)
:AddVariable( "EMPRESA", "NOMBRE", "'"+oApp:x_NOMEMP+"'" )
:AddVariable( "EMPRESA", "SINONIMO", "'"+oApp:x_SIGLA+"'" )
:AddVariable( "EMPRESA", "DIRECCION", "'"+oApp:x_DIREMP+"'" )
:AddVariable( "EMPRESA", "CIUDAD", "'"+oApp:x_CIUEMP+"'" )
:AddVariable( "EMPRESA", "DEPTO", "'"+oApp:x_DEPEMP+"'" )

End


Return Nil

//--------------------------------------------// 
function mysqlfield1( oQry ) // coloca las colunas separada por ; Eje codprov;nombre,ciud
Local clField := ""
local nLen, x

nLen := oQry:FCount() 
for x := 1 to oQry:FCount()
cLfield := cLfield + oQry:FieldName( x ) + iif( x < nLen ,";","" )
Next
Return cLfield 


//--------------------------------------------------------------------------/

PROCEDURE MAKEDATASET( oFr, cAlias, oQry, bRelation )
*--
LOCAL nHeader
LOCAL cHeader := ''
*--
DEFAULT bRelation := { || NIL }
*--
cHeader := mysqlfield1( oQry )

oFr:SetUserDataSet(cAlias, cHeader,;
{||oQry:Skip(), EVAL( bRelation ) },;
{||oQry:Skip(-1), EVAL( bRelation ) }, ;
{||oQry:GoTop(), EVAL( bRelation ) }, ;
{||oQry:EOF() },;
{| cField | bs_mostda12(oQry,cField," "," ") } )

*--


RETURN



******************************************************************************************


STATIC PROCEDURE DETE_PROD( oQry, oQry1, oQry2, oQry3 ) // aVar )
*--
LOCAL cFiltro,cSele12
If ! oQry:Eof()
cFiltro := " planta = '"+alltrim(oQry:planta)+"' "
cFiltro += " AND codprod = '"+alltrim(oQry:codprod)+"' "
cFiltro += " AND verprod = "+alltrim(str(oQry:verprod))
If ! oQry1:Eof() > 0 
oQry1:SetWhere( cFiltro, .T. )
Endif
If ! oQry2:Eof() > 0 
oQry2:SetWhere( cFiltro, .T. )
Endif
If ! oQry3:Eof() > 0 
oQry3:SetWhere( cFiltro, .T. )
Endif
Else
Endif


RETURN
*--

 

Re: Pregunta para el amigo Daniel

Posted: Thu Feb 09, 2012 10:17 pm
by Daniel Garcia-Gil
Hola

es mucha informacion que asimilar, mas facil es explicarte la tecnica

ya que construyes la sentencia en una variable y despues lanzas el query oDbf := oApp:oServer:Query(cSelect)
puedes crear la sentencia de esta forma

cSelect = "SELECT * FROM table WHERE [WHERE]"
despues sustituimos [WHERE] por lo que queramos.. ejemplo

cSelect = StrTran( cSelect, "[WHERE]", "table.id=1" )

creo que este simple ejemplo muestra perfectamente la tecnica, espero te sirva

Re: Pregunta para el amigo Daniel

Posted: Thu Feb 09, 2012 10:46 pm
by ruben Dario
Daniel Coloque el codigo mas corto tienes razon es muy largo. para ver si la cojo.

Lo Query los ejecuta bien, el problema es para que relacione con el Fastreport

Mi preguna el VALOR del WHERE que tu dices lo hago una vez , pero en el reporte cuando cambia de codigo me dele enlazar los registro correspondientes a dicho codigo.

Algo similar como hago con ADO Filter
cFiltro := " planta = '"+alltrim(oQry:planta)+"' "
cFiltro += " AND codprod = '"+alltrim(oQry:codprod)+"' "
cFiltro += " AND verprod = "+alltrim(str(oQry:verprod))

aQry:Filter := ( cFiltro)

Re: Pregunta para el amigo Daniel

Posted: Thu Feb 09, 2012 10:57 pm
by Daniel Garcia-Gil
Disculpa, no entiendo lo que dices

el post es en relacion a cambiar un nuevo filtro del where? o es para asignar el recordser al fast report?

Re: Pregunta para el amigo Daniel

Posted: Thu Feb 09, 2012 11:19 pm
by Miguel Salas
Hola Daniel y Ruben

Aprovecho este post para inmiscuirme, apenas voy a empezar con tdolphin podrian hacerme llegar algun ejemplo basico para principiante, les comento que ya he manejado querys SQl y he leido y usado mysql y sql server en otros lenguajes. Mas no he hecho nada aun con FW-Mysql por ello estoy declinando por usar tDolphin.

os Agradeceré bastante.
atte Miguel Salas
Saludos

Re: Pregunta para el amigo Daniel

Posted: Fri Feb 10, 2012 2:32 pm
by ruben Dario
Saludos

Daniel es para el Fastreport
Es como un reporte Maestro Detalle (Si no que manejo 4 Query)

ya las sentencias SQL no tengo problemas.

En principo con ADO Hago Las sentencisa SQl y hago Filtros para seleccionar
oQry1:Filter := ( planta = "01" and codprov ="0001" ) Ejemplo
El filter en Ado , es que selecciona una serie de registro que cumplna la condicion
En Tdholhin cuan seria el Equivalente (Veo que tiene oQry1:Find , oQry1:Seek , oQry1:Locate)
en fin que me recomendario como deberia hacerlo.

Tengo Mi base datos la idea seria esta

Tabla 1
Codprod Simbolo
1 "Datos 1"
2 "Datos 1"
3 "Datos 1"
4 "Datos 1"
5 "Datos 1"



Tabla 2
Codprod Simbolo1
1 "Simbolo a 1"
1 "Simbolo b 1"
2 "Simbolo 2"
3 "Simbolo 3"
4 "Simbolo 4"

Tabla 3
Codprod Simbolo3
1 "Sim Tabla 3"
1 "Sim Tabla 3"
2 "Sim Tabla 3"
3 "Sim Tabla 3"
4 "Sim Tabla 3"


Cuando genero mi Reporte me lee cada registro de la tabla1 y muestre a continuacion los registro esta en la tabla 2 y asi sucesivamente.

Reporte.

CodProd Simbolo
1 Dato 1
Simbolo a 1" de la tabla 2
Simbolo b 1" de la tabla 2

Sim Tabla 3" de la tabla 3
Sim Tabla 3" de la tabla 3
2 Dato 2
.....

Re: Pregunta para el amigo Daniel

Posted: Fri Feb 10, 2012 2:34 pm
by ruben Dario
Miguel

Mira Este Link Hay ejemplo con Tdolphin

[http://www.4shared.com/file/X5D8CfKl/Prototipo.html

Re: Pregunta para el amigo Daniel

Posted: Fri Feb 10, 2012 2:53 pm
by Daniel Garcia-Gil
Ruben...

Dolphin no maneja filtros internos ( no seria mala idea tratar de implementarlos, trabajare en ello ), debes regenarar la consulta con el nuevo filtro (WHERE), puedes usar la tecnica que te expuse anteriormenete

Re: Pregunta para el amigo Daniel

Posted: Fri Feb 10, 2012 4:20 pm
by wmormar
Ruben,

Para que funcione la parte del where como lo estas comentando, seria de la siguiente manera:


cFiltro := " a1.planta = '"+alltrim(oQry:planta)+"' "
cFiltro += " AND a1.codprod = '"+alltrim(oQry:codprod)+"' "
cFiltro += " AND a1.verprod = "+alltrim(str(oQry:verprod))

considerando que planta, codprod y verprod pertenecen a "a1", sino antepones a que tabla pertenecen nunca funcionará, pues tu Query usa la referencia (algo asi como un alias) de las tablas.

Re: Pregunta para el amigo Daniel

Posted: Sat Feb 11, 2012 4:24 am
by Miguel Salas
Ruben tienes la contraseña del prototipo?

Re: Pregunta para el amigo Daniel

Posted: Sat Feb 11, 2012 3:08 pm
by ruben Dario
Miguel
Te pide contrasena creo que no tiene, deme su correo te lo mando.

Re: Pregunta para el amigo Daniel

Posted: Wed Feb 22, 2012 6:45 pm
by Miguel Salas
Estoy atorado, tengo el ejemplo tdolphin rterraz de Daniel

me da "sintax error at 'oserver' ", que me falta agregar

Re: Pregunta para el amigo Daniel

Posted: Wed Feb 22, 2012 7:48 pm
by Daniel Garcia-Gil
Hola

no recuerdo cual es ese ejemplo... podrias colocar el fuente aqui .... gracias