TDolphin - Como se muestra informaciones relacionadas

TDolphin - Como se muestra informaciones relacionadas

Postby Kleyber » Sun Dec 08, 2013 2:00 pm

Hola a todos,

Estoy migrando mi sistema para Harbour con TDolphin y les comento que TDolphin es fantastico.

Aún tengo algunas dudas y deseo saber sus comentarios:

Tengo la siguiente query:

Code: Select all  Expand view  RUN

DEFINE QUERY oQry "SELECT * FROM tab_produtos ORDER BY nome"
 


Que es la base de mi browse y edición.

1 - En esta tabla existe un campo (llave estrangera) llamada id_grupos_fk que logicamente es un campo (integer) y me gustaria mostrar en el browse la descripción del grupo en el browse. Como hacer esto?

2 - En la dialog de edición tengo la misma situación: Existe el campo oQry:id_grupos_fk que me muestra el codigo y deseo hacer una busqueda usando GET con BITMAP donde me abre una otra dialog con el cadastro de grupos para escoger el grupo adecuado. Como hacer para que en la dialog se muestre la descripción del grupo, pero sea grabado el codigo en el campo id_grupos_fk?
Kleyber Derick

FWH / xHb / xDevStudio / SQLLIB
User avatar
Kleyber
 
Posts: 581
Joined: Tue Oct 11, 2005 11:28 am
Location: São Luiz, Brasil

Re: TDolphin - Como se muestra informaciones relacionadas

Postby Daniel Garcia-Gil » Sun Dec 08, 2013 2:24 pm

Hola

por lo que comentas no es una situacion que dependa de dolphin sino de tu consulta en mysql, debes realizar la consulta relacionando las tablas y listo

imagino seria algo parecido a esto:
Code: Select all  Expand view  RUN

DEFINE QUERY oQry "SELECT tab_produtos.*, grupos.descripcion FROM tab_produtos INNER JOIN grupos ON grupos.id = tab_productos.id_grupos_fk ORDER BY nome"
 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: TDolphin - Como se muestra informaciones relacionadas

Postby Kleyber » Sun Dec 08, 2013 3:20 pm

Daniel,

Gracias. El punto 1 esta resuelto. Estoy con el punto 2 intentando resolver. Lo que tengo es esto:

Tengo la query definida asi:

Code: Select all  Expand view  RUN

DEFINE QUERY oQry "SELECT p.*, g.descricao, f.empresa";
+" FROM tab_produtos p";
+" INNER JOIN tab_grupos g ON g.idtab_grupos = p.id_grupos_fk";
+" INNER JOIN tab_fornecedores f ON f.idtab_fornecedores = p.id_fornecedores_fk";
+" ORDER BY nome"
 


Que uso para el browse y para la edición. Hasta ahi todo ok.

Pero en la edicón no hace ningun update en la tabla.

Aun tengo este caso abajo:

Code: Select all  Expand view  RUN

REDEFINE GET oFornecedor VAR oQry:id_fornecedores_fk ID 106 OF oDlg ;
  ACTION ( oQry:id_fornecedores_fk:=CadFor(1),;
           oFornecedor:Refresh(), oNomeFornecedor:Refresh(), oQry:Refresh(), xSetFocus(oPipi), oDlg:Refresh() ) ;
        BITMAP "PESQ16"
 


Donde la función CadFor me devuelve el codigo de fornecedor y necesito también que refresque el campo oQry:empresa, que es el nombre del fornecedor (oNomeFornecedor). No esta me refrescando el codigo recibido ni tampoco el nombre de la empresa. Alguna sugerencia?
Kleyber Derick

FWH / xHb / xDevStudio / SQLLIB
User avatar
Kleyber
 
Posts: 581
Joined: Tue Oct 11, 2005 11:28 am
Location: São Luiz, Brasil

Re: TDolphin - Como se muestra informaciones relacionadas

Postby Kleyber » Sun Dec 08, 2013 6:44 pm

Pues parece que si dejo la query con los INNERs definidos, la instrucción oQry:save() no funciona.
Kleyber Derick

FWH / xHb / xDevStudio / SQLLIB
User avatar
Kleyber
 
Posts: 581
Joined: Tue Oct 11, 2005 11:28 am
Location: São Luiz, Brasil

Re: TDolphin - Como se muestra informaciones relacionadas

Postby Daniel Garcia-Gil » Sun Dec 08, 2013 7:39 pm

Exacto...

No puedes hacer un save de un query relacional. Puedes usar una sentencia INSERT directamente
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: TDolphin - Como se muestra informaciones relacionadas

Postby Kleyber » Sun Dec 08, 2013 11:53 pm

Daniel,

Gracias. Lo que pasa es que mi sistema presenta primeramente el browse y desde ahi uso los dialogos. Es cierto entonces que yo tengo que usar 2 objectos distinctos, uno para el browse y otro para los dialogos, donde en el dialogo no hago un DEFINE QUERY sin relacionamientos?
Kleyber Derick

FWH / xHb / xDevStudio / SQLLIB
User avatar
Kleyber
 
Posts: 581
Joined: Tue Oct 11, 2005 11:28 am
Location: São Luiz, Brasil

Re: TDolphin - Como se muestra informaciones relacionadas

Postby carlos vargas » Mon Dec 09, 2013 12:16 am

Hola Kleyber.

esa situación me he encontrado hoy, pero te comento como lo hago.
el browse lo muestro con una consulta que muestra una tabla con sus relaciones , es solamente para mostrar en el browse (es una vista en realidad),
luego a la hora de editar, hago una segunda consulta, de una sola fila (la misma que estoy posicionada en el browse) solamente para tomar los datos a editar, esta tampoco es editable ( esto en los casos en que el los datos a editar no estén el el primer query, en los casos en que todos los datos a editar esten el el primer query los tomo de ahi directo), y para insertar, actualizar lo hago directamente a las tablas involucradas.
para borrar también lo hago directo.

te muestro un modulo completo para que te hagas una idea:

NOTA:tengo algunas extenciones propias para dolphin que usos por ejemplo query2, execute2, requery, etc. pero es mas por comodidad que otra cosa.

Code: Select all  Expand view  RUN

/*-------------------------------------------------------------------------------------------------*/

#include "credicom.ch"

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Cobradores()
   PRIVATE oError
   PRIVATE oDlg, oBrw, oToolbar, oPopUp1, oBtnFilter
   PRIVATE oQryCtrl, oQryCiud, oQryCobr
   PRIVATE lFiltrado

   lFiltrado := FALSE

   TRY
      oQryCtrl := oServer:Query2( "SELECT CONT_COBR FROM CONTROL" )
      oQryCiud := oServer:Query2( "SELECT NUM_CIUD, NOMBRE FROM CIUDADES ORDER BY NOMBRE" )
      oQryCobr := oServer:Query2( "SELECT * FROM vCATCOBR ORDER BY NUM_COBR")
   CATCH oError
      ShowError( oError, { oQryCtrl, oQryCiud, oQryCobr } )
      RETURN
   END

   oQryCobr:gotop()

   DEFINE DIALOG oDlg NAME "DLG_COBRADORESC" OF oMainWnd ICON GetIcon() FONT oFontD

   REDEFINE XBROWSE oBrw DATASOURCE oQryCobr ID 101 OF oDlg AUTOSORT ;
      ON DBLCLICK Cobradores_Editar( FALSE ) FONT oFontD

   ADD TO oBrw DATA oQryCobr:NUM_COBR TITLE "Número"          SIZE 080 CENTER PICTURE "@L 999"
   ADD TO oBrw DATA oQryCobr:NOMBRE   TITLE "Nombre cobrador" SIZE 250
   ADD TO oBrw DATA oQryCobr:CIUDAD   TITLE "Ciudad"          SIZE 050
   ADD TO oBrw DATA oQryCobr:ACTIVO   TITLE "Act"             SIZE 050

   WITH OBJECT oBrw
      :MyConfig()
      :aCols[ 01 ]:cSortOrder := "NUM_COBR"
      :aCols[ 02 ]:cSortOrder := "NOMBRE"
      :aCols[ 03 ]:cSortOrder := "CIUDAD"
      :aCols[ 04 ]:SetCheck( { "BMS_CHECKON","BMS_CHECKOFF" } )
      :bKeyDown      := {|nKey| Cobradores_ProcesaTecla( nKey ) }
      :lHScroll      := FALSE
      :nHeaderHeight := 36
      :nFreeze       := 4
   END

   ACTIVATE DIALOG oDlg ON INIT Cobradores_Toolbar()

   oQryCtrl:END()
   oQryCiud:END()
   oQryCobr:END()

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Cobradores_Toolbar()

   MENU oPopUp1 POPUP 2010
      MENUITEM "Mostrar solo &inactivos" ACTION Cobradores_Filtrar( 1 )
      MENUITEM "Mostrar solo &activos"   ACTION Cobradores_Filtrar( 2 )
      SEPARATOR
      MENUITEM "Mostrar &todos"          ACTION Cobradores_Filtrar( 3 )
   ENDMENU

   DEFINE BUTTONBAR oToolBar OF oDlg SIZE 60, 60 2010

   DEFINE BUTTON NAME "TB_CLOSE"     OF oToolBar ACTION oDlg:END()                 PROMPT "&Salir"
   DEFINE BUTTON NAME "TB_ADD"       OF oToolBar ACTION Cobradores_Editar( TRUE  ) PROMPT "&Nuevo"   GROUP
   DEFINE BUTTON NAME "TB_EDIT"      OF oToolBar ACTION Cobradores_Editar( FALSE ) PROMPT "&Editar"
   DEFINE BUTTON NAME "TB_DELETE"    OF oToolBar ACTION Cobradores_Borrar()        PROMPT "&Borrar"
   DEFINE BUTTON NAME "TB_PRINTER"   OF oToolBar ACTION Cobradores_Listar()        PROMPT "&Imprimir"
   DEFINE BUTTON NAME "TB_FILTERADD" OF oToolBar ACTION Cobradores_Filtrar( 3 )    PROMPT "&Filtrar"  MENU oPopUp1 GROUP

   SET MSGBAR OF oDlg TO "INS=Nuevo, DEL=Borrar, ENTER=Editar, F3=Imprimir, F5=Filtrar, F9=Refrescar" 2010

   oDlg:SetControl( oBrw )

   WITH OBJECT oToolBar
      :bRClicked := {|| NIL }
      :bLClicked := {|| NIL }
      :aControls[ 1 ]:cToolTip := "Cierra modulo."
      :aControls[ 2 ]:cToolTip := "Agrega un nuevo registro."
      :aControls[ 3 ]:cToolTip := "Edita datos del registro actual."
      :aControls[ 4 ]:cToolTip := "Elimina datos del registro actual."
      :aControls[ 5 ]:cToolTip := "Lista datos para ser impresos."
      :aControls[ 6 ]:cToolTip := "Filtra registros a mostrar."
      oBtnFilter := :aControls[ 06 ]
   END

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Cobradores_ProcesaTecla( nKey )

   DO CASE
   CASE nKey == VK_INSERT
      Cobradores_Editar( TRUE  )
   CASE nKey == VK_RETURN
      Cobradores_Editar( FALSE )
   CASE nKey == VK_DELETE
      Cobradores_Borrar()
   CASE nKey == VK_F3
      Cobradores_Listar()
   CASE nKey == VK_F5
      IF !lFiltrado
         Cobradores_Filtrar( 2 )
      ELSE
         Cobradores_Filtrar( 3 )
      ENDIF
   CASE nKey == VK_F9
      Refrescar_Browse( oBrw )
   ENDCASE

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Cobradores_Filtrar( nOpcion )

   TRY
      DO CASE
      CASE nOpcion==1
         oQryCobr:SetWhere( "ACTIVO=" + Var2Str( FALSE ), TRUE )
      CASE nOpcion==2
         oQryCobr:SetWhere( "ACTIVO=" + Var2Str( TRUE  ), TRUE )
      CASE nOpcion==3
         oQryCobr:SetWhere( "", TRUE )
      END
      IF nOpcion < 3
         WITH OBJECT oBtnFilter
            :FreeBitmaps()
            :LoadBitmaps( "TB_FILTERDEL" )
            :cTooltip := "Elimina filtro, muestra todos los cobradores."
            :Refresh()
         END
         lFiltrado := TRUE
      ELSE
         WITH OBJECT oBtnFilter
            :FreeBitmaps()
            :LoadBitmaps( "TB_FILTERADD" )
            :cTooltip := "Filtra los cobradores por estado."
            :Refresh()
         END
         lFiltrado := FALSE
      ENDIF
   CATCH oError
      ShowError( oError )
      RETURN
   END

   oBrw:GoTop()
   oBrw:Refresh()
   oBrw:SetFocus()

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Cobradores_Borrar()
   LOCAL oQryTmp

   IF oQryCobr:eof()
      MsgAlert( "No hay cobradores registradas, nada que borrar." )
   ELSE
      IF MsgNoYes( "Desea borrar datos del cobrador seleccionado?" )
         TRY
            oQryTmp := oServer:Query2( "SELECT COUNT(*) AS CONTADOR FROM RUTAS WHERE NUM_COBR=%1", { oQryCobr:NUM_COBR } )
            IF oQryTmp:CONTADOR > 0
                MsgAlert( "No se puede borrar al cobrador seleccionado, ya fue asignado a una ruta de cobro" )
            ELSE
               oServer:Execute2( "DELETE FROM COBRADORES WHERE NUM_COBR=%1", { oQryCobr:NUM_COBR } )
               oQryCobr:ReQuery()
            ENDIF
            oQryTmp:End()
         CATCH oError
            ShowError( oError, { oQryTmp } )
         END
         oBrw:Refresh()
      ENDIF
   ENDIF
   oBrw:SetFocus()

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Cobradores_Editar( lNuevo )
   LOCAL  oQryTmp

   PRIVATE oDlgE
   PRIVATE nNumCiud, cNomCiud, nNumCobr, cNomCobr, cDomCobr, cTelCobr, cCedCobr, dIngCobr, dRetCobr, lActivo, cNota
   PRIVATE oNomCiud

   IF oQryCiud:Eof()
      MsgAlert( "No hay ciudades/oficina definidas, no puede continuar." )
      oBrw:SetFocus()
      RETURN
   ENDIF

   IF lNuevo
      nNumCobr := oQryCtrl:CONT_COBR + 1
      nNumCiud := 0
      cNomCiud := ""
      cNomCobr := Space( 40 )
      cDomCobr := Space( 80 )
      cTelCobr := Space( 20 )
      cCedCobr := Space( 16 )
      dIngCobr := Date()
      dRetCobr := CToD( "" )
      lActivo  := TRUE
      cNota    := ""
   ELSE
      IF oQryCobr:Eof()
         MsgAlert( "No hay cobradores registrados, nada que editar." )
         oBrw:SetFocus()
         RETURN
      ENDIF

      TRY
         oQryTmp  := oServer:Query2( "SELECT * FROM vCATCOBR_E WHERE NUM_COBR=%1 LIMIT 1", { oQryCobr:NUM_COBR } )
         nNumCobr := oQryTmp:NUM_COBR
         nNumCiud := oQryTmp:NUM_CIUD
         cNomCiud := oQryTmp:CIUDAD
         cNomCobr := oQryTmp:NOMBRE
         cDomCobr := oQryTmp:DOMICILIO
         cTelCobr := oQryTmp:TELEFONOS
         cCedCobr := oQryTmp:CEDULA
         dIngCobr := oQryTmp:FECHA_ING
         dRetCobr := oQryTmp:FECHA_RET
         lActivo  := oQryTmp:ACTIVO
         cNota    := oQryTmp:NOTA
         oQryTmp:END()
      CATCH oError
         ShowError( oError, { oQryTmp } )
         RETURN
      END

   ENDIF

   DEFINE DIALOG oDlgE NAME "DLG_COBRADORESE" OF oDlg ICON GetIcon() FONT oFontD

   REDEFINE GET nNumCobr ;
      ID 101 OF oDlgE ;
      PICTURE "999" ;
      WHEN FALSE

   REDEFINE GET cNomCobr ;
      ID 102 OF oDlgE ;
      PICTURE "@!"

   REDEFINE GET cDomCobr ;
      ID 103 OF oDlgE ;
      PICTURE "@!"

   REDEFINE GET oNomCiud VAR cNomCiud ;
      ID 104 OF oDlgE ;
      WHEN FALSE ;
      UPDATE

   REDEFINE BUTTON ;
      ID 105 OF oDlgE ;
      ACTION Cobradores_SeleccionarCiudad()

   REDEFINE GET cTelCobr ;
      ID 106 OF oDlgE ;
      PICTURE "@!"

   REDEFINE GET cCedCobr ;
      ID 107 OF oDlgE ;
      PICTURE "@!"

   REDEFINE GET dIngCobr ;
      ID 108 OF oDlgE ;
      PICTURE "@D"

   REDEFINE GET dRetCobr ;
      ID 109 OF oDlgE ;
      PICTURE "@D" ;
      WHEN !lNuevo

   REDEFINE CHECKBOX lActivo ;
      ID 110 OF oDlgE ;
      WHEN !lNuevo ;
      ON CHANGE Cobradores_Estado() ;
      UPDATE

   REDEFINE GET cNota ;
      ID 111 OF oDlgE ;
      MEMO

   REDEFINE BUTTON ;
      ID 201 OF oDlgE ;
      WHEN !Empty( cNomCobr ) .and. nNumCiud > 0 ;
      ACTION IIf( Cobradores_Grabar( lNuevo ), oDlgE:END(), NIL )

   REDEFINE BUTTON ;
      ID 202 OF oDlgE ;
      ACTION oDlgE:END() ;
      CANCEL

   ACTIVATE DIALOG oDlgE

   oBrw:SetFocus()

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Cobradores_Estado()
   LOCAL oQryTmp

   TRY
      IF !lActivo
         oQryTmp := oServer:Query2( "SELECT COUNT(*) AS CONTADOR FROM CLIENTES WHERE NUM_COBR=%1", { nNumCobr } )
         IF oQryTmp:CONTADOR > 0
            lActivo := TRUE
            oDlgE:Update()
            MsgAlert( "Hay una ruta de cobro que tiene a este cobrador asignado, por tanto no se puede desactivar." )
         ENDIF
         oQryTmp:END()
      ENDIF
   CATCH oError
      ShowError( oError, { oQryTmp } )
   END

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Cobradores_SeleccionarCiudad()
   LOCAL bEval := {|| nNumCiud := oQryCiud:NUM_CIUD, ;
                      cNomCiud := oQryCiud:NOMBRE  , ;
                      oNomCiud:Refresh() }

   QSeleccionar( oDlgE, oQryCiud, "NOMBRE", "Lista de Ciudad/Oficina", bEval )

RETURN

/*-------------------------------------------------------------------------------------------------*/

FUNCTION Cobradores_Grabar( lNuevo )
   LOCAL cWhere
   LOCAL lGrabado := FALSE

   TRY
      oServer:BeginTransaction()
      IF lNuevo
         oServer:Execute2( "UPDATE CONTROL SET CONT_COBR=%1", { nNumCobr } )
         oServer:Insert( "COBRADORES", { "NUM_CIUD", "NUM_COBR", "NOMBRE", "DOMICILIO", "TELEFONOS", "CEDULA", "FECHA_ING", "FECHA_RET", "ACTIVO", "NOTA" }, ;
                                       { nNumCiud  , nNumCobr  , cNomCobr, cDomCobr,    cTelCobr,    cCedCobr, dIngCobr,    dRetCobr   , lActivo , cNota  }  )
      ELSE
         cWhere := "NUM_COBR=" + Var2Str( nNumCobr )
         oServer:Update( "COBRADORES", { "NUM_CIUD", "NUM_COBR", "NOMBRE", "DOMICILIO", "TELEFONOS", "CEDULA", "FECHA_ING", "FECHA_RET", "ACTIVO", "NOTA" }, ;
                                       { nNumCiud  , nNumCobr  , cNomCobr, cDomCobr,    cTelCobr,    cCedCobr, dIngCobr,    dRetCobr   , lActivo , cNota  }, cWhere  )
      ENDIF
      oServer:CommitTransaction()
      IIf( lNuevo, oQryCtrl:ReQuery(), NIL )
      oQryCobr:ReQuery()
      lGrabado := TRUE
   CATCH oError
      oServer:RollBack()
      ShowError( oError )
   END

   IF lGrabado
      IIf( lNuevo, ( oBrw:GoBottom(), oBrw:Refresh() ), oBrw:RefreshCurrent() )
   ELSE
      oBrw:GoTop()
   ENDIF

RETURN lGrabado

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Cobradores_Listar()
RETURN

/*-------------------------------------------------------------------------------------------------*/
/*EOF*/
/*-------------------------------------------------------------------------------------------------*/

 


vCATCOBR
select `A`.`NUM_COBR` AS `NUM_COBR`,`A`.`NOMBRE` AS `NOMBRE`,`A`.`NUM_CIUD` AS `NUM_CIUD`,`B`.`NOMCOR` AS `CIUDAD`,`A`.`ACTIVO` AS `ACTIVO` from (`COBRADORES` `A` left join `CIUDADES` `B` on((`A`.`NUM_CIUD` = `B`.`NUM_CIUD`)))


vCATCOBR_E
select `A`.`NUM_CIUD` AS `NUM_CIUD`,`A`.`NUM_COBR` AS `NUM_COBR`,`A`.`NOMBRE` AS `NOMBRE`,`A`.`CEDULA` AS `CEDULA`,`A`.`DOMICILIO` AS `DOMICILIO`,`A`.`TELEFONOS` AS `TELEFONOS`,`A`.`FECHA_ING` AS `FECHA_ING`,`A`.`FECHA_RET` AS `FECHA_RET`,`A`.`ACTIVO` AS `ACTIVO`,`A`.`NOTA` AS `NOTA`,`B`.`NOMBRE` AS `CIUDAD` from (`COBRADORES` `A` left join `CIUDADES` `B` on((`A`.`NUM_CIUD` = `B`.`NUM_CIUD`)))
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: TDolphin - Como se muestra informaciones relacionadas

Postby Kleyber » Mon Dec 09, 2013 12:40 pm

Carlos,

Una vez mas gracias por responder. Acaso estas en el GTalk? estoy en linea.
Kleyber Derick

FWH / xHb / xDevStudio / SQLLIB
User avatar
Kleyber
 
Posts: 581
Joined: Tue Oct 11, 2005 11:28 am
Location: São Luiz, Brasil


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 47 guests