Tdolphin Ejemplo ABM.

Tdolphin Ejemplo ABM.

Postby José Ríos » Wed Jan 04, 2012 8:39 pm

Buen dia.

Creo que seria de utilidad para todos los que estamos empezando con tdolphin si pusieramos ejemplos de programas echos con esta clase para retroalimentarnos y poder usar la clase en toda su funcionalidad. Aqui les dejo un primer ejemplo de altas bajas y modificaciones, no se si sea optimo espero sus comentarios para la mejora de dicho programa.

Code: Select all  Expand view

function Main()

   local oWnd:=WndMain(),oBar, oPopup, oBtn
   local WcDirectorioPrograma:=allTrim(CurDir())
   local WcAux,WaStruct
   local W_cDirTrabajo,WnSec1,WcClaveAcceso:=space(10)
   local oServer,cQuery

   private oFontArial9,oFontArial8
   public WaStructFacuras:={}

   DEFINE FONT oFontArial9  NAME "Arial" SIZE 0, -9
   DEFINE FONT oFontArial8  NAME "Arial" SIZE 0, -8

   set deleted ON
    set talk OFF
    set exact ON
    set confirm ON
    set century On
    set date FRENCH
   
   if date()<cToD('15/09/2010')
      msgStop('La fecha del sistema es incorrecta')
      release all
      resAllFree()
      memory(-1)
      PostQuitMessage(0)
      __Quit()
      quit
   endIf

    CONNECT EMBEDDED oServer ;
          DATABASE "AdmiPos" ;
          OPTIONS "Dolphin_server_embedded",;
                  "--datadir=./datos/",;
                  "--language=./sysdir/spanish/",;
                  "--skip-innodb",;
                  "--key-buffer-size=64MB",;
                  "--console";
          GROUPS "Dolphin_server_embedded",

    //

    //Table Structure (like dbf)
   //Name, Type, Length, Decimal, Not Null (logical), Defaul value
    WaStruct={{"ini_Empresa","C",100,0,.t.,},;
                 {"ini_pathconection","C",100,0,.t.,},;
             {"DirCDFS","C",40,0,.t.,};
             }

    //CreateTable( cTable, aStruct, cPrimaryKey, cUniqueKey, cAuto, cExtra, lIfNotExist, lVer )
    if .not. oServer:TableExist( 'Inicia' )
      oServer:CreateTable( "inicia", WaStruct, , , ,"ENGINE = InnoDB",.t. )
      DEFINE QUERY oQry "SELECT * FROM inicia"
      oQry:GetBlankRow( .F. )
      oQry:ini_empresa:='InterWin'     
      oQry:save()
    endIf

    WaStruct={{"ven_id","N",10,0,.t.,},;
                 {"ven_nombre","C",100,0,.t.,},;
             {"ven_comi","N",5,2,.t.,},;
             {"ven_usuario","C",100,0,.t.,},;
             {"ven_fecha","D",10,0,.t.,},;
             {"ven_hora","D",10,0,.t.,};
             }

   if .not. oServer:TableExist( 'vendedores' )
      oServer:CreateTable( "vendedores", WaStruct,"ven_id" , ,"ven_id" ,"ENGINE = InnoDB",.t. )
   endIf

   SetBalloon( .T. ) // Balloon shape required for tooltips

   DEFINE WINDOW oWnd TITLE "SISTEMA DE AMINISTRACION Y FACTURACION ELECTRONICA "+space(5);
       MENU BuildMenu(WcDirectorioPrograma,oWnd,oServer)


   ACTIVATE WINDOW oWnd MAXIMIZED;
      VALID MsgYesNo( "¿Desea salir?" )

   oFontArial9:end()
   release all
   resallfree()
   memory(-1)
   PostQuitMessage(0)
   __Quit()
   quit
return nil

function BuildMenu(cDirectorioPrograma,oWnd,oServer)
   local WcDirTrabajo:=''

   local oMenu

   MENU oMenu 2007
      MENUITEM "Catalogos"
      MENU
         MENUITEM "Vendedores"  action BuscaVendedores(cDirectorioPrograma,'Vendedores',oServer)
      ENDMENU
   ENDMENU

return oMenu

function DefineColoresGet(oGet)   
   oGet:bGotFocus:={|| oGet:SetColor(nRgb(15,15,15),nRgb(208,218,242))}
   oGet:bLostFocus:={|| oGet:SetColor(nRgb(15,15,15),nRgb(255,255,255))}
return NIL

Function BuscaVendedores(cDirectorioPrograma,cEnvia,oServer)
   local oDlg, oBrw, oCol,oSayCadenaBusqueda,oQry
   local i,WcCadenaBusqueda:='',WcCodigoElegido:=0

   DEFINE DIALOG oDlg RESOURCE "General_busca" title 'Edicion de Contenido'

   oServer:SetNameServer( "Central" )

   DEFINE QUERY oQry "SELECT * FROM Vendedores order by ven_id" OF "Central"


   oBrw := TXBrowse():New( oDlg)
   oBrw:nMarqueeStyle       := MARQSTYLE_HIGHLROW
   oBrw:nColDividerStyle    := LINESTYLE_BLACK
   oBrw:nRowDividerStyle    := LINESTYLE_BLACK
   oBrw:lColDividerComplete := .t. 
   oBrw:bClrStd := { || If( ( oBrw:KeyNo() % 2 ) == 0, { CLR_BLACK, RGB( 224, 236, 255 ) }, { CLR_BLACK, RGB( 189, 211, 253 ) } ) }

   oCol := oBrw:AddCol()
   oCol:bStrData  := { ||str(oQry:ven_id,3)}
   oCol:cHeader   := "file"
   oCol:nWidth        := 82

   oCol := oBrw:AddCol()
   oCol:bStrData  := { ||AllTrim( oQry:ven_nombre)}
   oCol:cHeader   := "file name"
   oCol:nWidth        := 82

   for i=1 to len(oBrw:aCols)
       oBrw:aCols[ i ]:blDClickData  := {|r,c,f,o| dVendedores("EDITA",cDirectorioPrograma,oQry),oBrw:GoTop(),oBrw:refresh()}
   next

   oBrw:CreateFromResource( 101 )

   oBrw:setdolphin(oQry, .F.)

    ACTIVATE DIALOG oDlg CENTERED ON INIT (BuildBarDlgVendedores( oDlg,cDirectorioPrograma,oBrw,cEnvia,oQry ),;
            oBrw:SetFocus())


return WcCodigoElegido
//----------------------------------------------------------------------------//


function BuildbarDlgVendedores( oDlg,cDirectorioPrograma,oBrw,cEnvia,oQry )
   local oBar,oBtnNuevo,oBtnEditar,oBtnImprimir,oBtnAExcel,oBtnInicio,oBtnFin,oBtnExit

   DEFINE BUTTONBAR oBar OF oDlg  SIZE 45, 45 2007

   DEFINE BUTTON oBtnNuevo OF oBar file cDirectorioPrograma+"\Nuevo.BMP" ;
      ACTION (EdVendedores("ALTA",cDirectorioPrograma,oQry),oBrw:GoTop(),oBrw:refresh() ) PROMPT "Nuevo"

   DEFINE BUTTON oBtnEditar OF oBar file cDirectorioPrograma+"\Editar.BMP" ;
      ACTION (EdVendedores("EDITA",cDirectorioPrograma,oQry),oBrw:GoTop(),oBrw:refresh()) PROMPT "Editar";


   DEFINE BUTTON oBtnImprimir OF oBar file cDirectorioPrograma+"\Imprimir.BMP" ;
      ACTION (ReporteVendedores(oQry),oBrw:GoTop(),oBrw:refresh() ) PROMPT "Imprimir" GROUP;

   DEFINE BUTTON oBtnInicio OF oBar file cDirectorioPrograma+"\Inicio.BMP" ;
      ACTION oBrw:goTop() PROMPT "Inicio" GROUP

   DEFINE BUTTON oBtnFin OF oBar file cDirectorioPrograma+"\fin.BMP" ;
      ACTION oBrw:goBottom() PROMPT "Fin"

   DEFINE BUTTON oBtnExit OF oBar file cDirectorioPrograma+"\exit.BMP" ;
      ACTION oDlg:End() PROMPT "Salir" group

   oBrw:refresh(.t.)
return nil

function EdVendedores(cStatus,cDirectorioPrograma,oQry)
   local oDbf,oBtnOK,oBtnCancela,oBtnBorra
   local oDlg,oFld,oBrW
   local oGets[40],oEspecial,oTipoProd,oImptosEspe,oIVAExto
   local WcAliasAnterior:=alias(),i

   if cStatus='ALTA'
      oQry:GetBlankRow( .F. )
   endIf

   DEFINE DIALOG oDlg RESOURCE "General_Catalogo"
 
   REDEFINE FOLDER oFld ID 110 OF oDlg;
    PROMPTS  "Generales";
    DIALOGS  "Vendedores_Grales"

   REDEFINE GET oGets[1] var oQry:ven_id ;
        ID 100 OF oFld:aDialogs[1] ;
      PICTURE '999';
        UPDATE

   REDEFINE GET oGets[2] var oQry:ven_nombre ;
        ID 101 OF oFld:aDialogs[1];
        UPDATE

   REDEFINE GET oGets[3] var oQry:ven_comi ;
        ID 102 OF oFld:aDialogs[1] ;
      PICTURE '99.99';
        UPDATE

   for i=1 to 3
      DefineColoresGet(oGets[i])
   next

   REDEFINE BUTTONBMP oBtnOK ID 51 OF oDlg;
        BITMAP cDirectorioPrograma+"\ok.BMP" ;
        PROMPT "Aceptar" TEXTRIGHT;
        ACTION if(ValidaGrabaVendedores(cStatus,oQry),;
                 if(cStatus='EDITA',oDlg:End(),(oQry:GetBlankRow( .F. ),oFld:update())),NIL);
        TOOLTIP "Acepta Seleccion"

   REDEFINE BUTTONBMP oBtnCancela ID 52 OF oDlg;
        BITMAP cDirectorioPrograma+"\Cancelar.BMP" TEXTRIGHT;
       PROMPT "Cancelar" ;
        ACTION (if(cStatus<>'EDITA',oQry:lAppend:=.f.,NIL),oQry:Refresh(),oDlg:End());
        TOOLTIP "Cancela edicion Seleccion" ;

   REDEFINE BUTTONBMP oBtnBorra ID 53 OF oDlg;
        BITMAP cDirectorioPrograma+"\Borrar.BMP" TEXTRIGHT;
       PROMPT "Borrar" ;
      WHEN cStatus<>'ALTA';
        ACTION (BorraVendedores(oQry),oDlg:End());
        TOOLTIP "Cancela edicion Seleccion" ;

   ACTIVATE DIALOG oDlg;
            CENTERED
   oGets:=NIL

return NIL

function ValidaGrabaVendedores(cStatus,oQry)

   if cStatus='ALTA'
      if oQry:ven_id=0
         msgStop('Debe de capturar numero')
         return .f.
      endIf
   endIf
   oQry:save()
   if cStatus='ALTA'
      oQry := oQry
      msgInfo('Alta Efectuada')
   endIf

return .t.

function BorraVendedores(oQry)
   if .not. MsgNoYes('¿Desea borrar el registro?')
      return NIL
   endIf

   oQry:Delete()
   oQry:refresh()

return NIL

function ReporteVendedores(oQry)
   local oReport
   local WcTitulo1:='Prueba',WcTitulo2:='Listado de vendedores al '+dToC(date())

    oQry:goTop()
    REPORT oReport ;
         TITLE allTrim(WcTitulo2) CENTER;
         HEADER allTrim(WcTitulo1) CENTER;
         FOOTER OemtoAnsi("P gina: ")+str(oReport:nPage,3) right;
         preview

      COLUMN TITLE 'Numero' ;
      DATA oQry:ven_id

      COLUMN TITLE 'Nombre';
      DATA oQry:ven_nombre;

      COLUMN TITLE '%  Comi' ;
      DATA oQry:ven_comi;
      PICTURE '99.99'

   End Report

   IF oReport:lCreated
      oReport:bSkip := {|| oQry:skip()}
   ENDIF

   ACTIVATE REPORT oReport
return NIL
 


En este ejemplo lo que no funciona es la rutina para imprimir el reporte, me lo muestra en blanco, si alguien me puede dar algun tip de como generar el reporte se lo agradeceria.

Saludos
Last edited by José Ríos on Thu Jan 05, 2012 5:25 am, edited 1 time in total.
José Ríos
 
Posts: 119
Joined: Fri Nov 04, 2005 12:23 am

Re: Tdolphin Ejemplo ABM.

Postby José Ríos » Wed Jan 04, 2012 11:46 pm

Corregido, con las siguientes modificaciones ya funciona el reporte:


Code: Select all  Expand view

function ReporteVendedores(oQry)
   local oReport
   local WcTitulo1:='Prueba',WcTitulo2:='Listado de vendedores al '+dToC(date())
   local WnLinea:=1,WnHasta:=0

    WnHasta:=oQry:lastRec()

    oQry:goTop()
    REPORT oReport ;
         TITLE allTrim(WcTitulo2) CENTER;
         HEADER allTrim(WcTitulo1) CENTER;
         FOOTER OemtoAnsi("P gina: ")+str(oReport:nPage,3) right;
         preview

      COLUMN TITLE 'Numero' ;
      DATA oQry:ven_id

      COLUMN TITLE 'Nombre';
      DATA oQry:ven_nombre;

      COLUMN TITLE '%  Comi' ;
      DATA oQry:ven_comi;
      PICTURE '99.99'

   End Report

   IF oReport:lCreated
      oReport:bSkip := {||WnLinea++,oQry:skip()}
   ENDIF

    ACTIVATE REPORT oReport WHILE WnLinea <= WnHasta

return NIL

 


Saludos
José Ríos
 
Posts: 119
Joined: Fri Nov 04, 2005 12:23 am

Re: Tdolphin Ejemplo ABM.

Postby Daniel Garcia-Gil » Wed Jan 04, 2012 11:48 pm

Jose

Muchas Gracias!!! :-D
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Tdolphin Ejemplo ABM.

Postby José Ríos » Thu Jan 05, 2012 5:30 am

Daniel

Gracias a ti por por poner a disposicion del foro la magnifica clase tdolphin.

Tengo algunas preguntas

* sobre la primary key: ¿se puede definir una primary key con dos campos (o columnas) en tdolphin?.

* como puedo cambiar el order by de un query sin volver a hacer un select?

Saludos
José Ríos
 
Posts: 119
Joined: Fri Nov 04, 2005 12:23 am

Re: Tdolphin Ejemplo ABM.

Postby Compuin » Thu Jan 05, 2012 10:22 am

Amigos,

En SQL no es buena practica el uso del SELECT *. Lo mejor es que hagan la consulta referenciando el o los campos que van a consultar.

Saludos
FWH 20.12
Hbmk2 32/64 Bits (Build 19.29.30133)
Microsoft Visual C 32 Bits
MySql 8.0.24 32/64 Bits
VS Code
Compuin
 
Posts: 1214
Joined: Tue Dec 28, 2010 1:29 pm
Location: Quebec, Canada

Re: Tdolphin Ejemplo ABM.

Postby wmormar » Thu Jan 05, 2012 2:58 pm

José Ríos,

Se puede perfectamente colocar mas de una columna (campo) como primary key
Y para el cambio de orden es necesario hacer una consulta nueva, salvo Daniel haga una funcion para que le enviemos el cambio de ORDER BY, pero internamente, se haria una consulta nueva.

saludos

José Ríos wrote:Daniel

Gracias a ti por por poner a disposicion del foro la magnifica clase tdolphin.

Tengo algunas preguntas

* sobre la primary key: ¿se puede definir una primary key con dos campos (o columnas) en tdolphin?.

* como puedo cambiar el order by de un query sin volver a hacer un select?

Saludos
William, Morales
Saludos

méxico.sureste
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

Re: Tdolphin Ejemplo ABM.

Postby carloslmm » Thu Jan 05, 2012 3:31 pm

Gracias a todos Maestros

estoy cambiando la base de datos y esta me parece un muy buena opcion, creo que esto y la ayuda de un gran amigo
william voy a salir adelante mas rapido


gracias de nuevo

carlos de la rosa perez

carloslmm@hotmail.com
carloslmm
 
Posts: 71
Joined: Sat Oct 20, 2007 3:02 pm
Location: Sinaloa Mexico

Re: Tdolphin Ejemplo ABM.

Postby José Ríos » Thu Jan 05, 2012 3:46 pm

William.

Gracias por responder.

¿Cual es la sintaxis para crear una primary key con mas de una columna?, lo intente de la siguiente forma:

oServer:CreateTable( "facturas", WaStructFacuras,"serie,numero" , , ,"ENGINE = InnoDB",.t. )

Pero al crearse la tabla me manda el siguiente error:

Application
===========
Path and name: C:\FWH1109\sistemas\AdmiPos\admipos.exe (32 bits)
Size: 2,232,832 bytes
Time from start: 0 hours 0 mins 0 secs
Error occurred at: 06/01/2012, 09:42:39
Error description: Error TDOLPHIN/9003 Internal Error:Invalid Primary Key
Args:

Stack Calls
===========
Called from: .\source\prg\tdolpsrv.prg => DOLPHIN_DEFERROR(2668)
Called from: .\source\prg\tdolpsrv.prg => TDOLPHINSRV:CHECKERROR(776)
Called from: .\source\prg\tdolpsrv.prg => TDOLPHINSRV:CREATETABLE(947)
Called from: ProcGral.prg => CREAARCHIVOS(629)
Called from: AdmiPos.prg => MAIN(66)
José Ríos
 
Posts: 119
Joined: Fri Nov 04, 2005 12:23 am

Re: Tdolphin Ejemplo ABM.

Postby wmormar » Thu Jan 05, 2012 9:06 pm

José Ríos,

Se tendria que modificar la clase para que hiciera lo que comentas, hasta ahora solo está diseñada para una columna.

saludos
William, Morales
Saludos

méxico.sureste
User avatar
wmormar
 
Posts: 1074
Joined: Fri Oct 07, 2005 10:41 pm
Location: México

Re: Tdolphin Ejemplo ABM.

Postby joseluisysturiz » Fri Jan 06, 2012 12:29 am

José Ríos wrote:Daniel

Gracias a ti por por poner a disposicion del foro la magnifica clase tdolphin.

Tengo algunas preguntas

* sobre la primary key: ¿se puede definir una primary key con dos campos (o columnas) en tdolphin?.

* como puedo cambiar el order by de un query sin volver a hacer un select?

Saludos


Probastes..?

oQry:SetOrder( "adj_insc ASC", .t. )

lo uso al igual que setwhere()
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Tdolphin Ejemplo ABM.

Postby evallejo » Sat Jan 07, 2012 11:31 pm

daniel

cuando uso
:lappend=.t.
:save()

el puntero se queda en el anterior, como si faltara un dbappend(). inserta el registro pero el puntero se queda en el anterior. o sea el ultimo registro es 10, adiciono, se inserta el registro 11 pero el puntero sigue en el 10, una manito plis

Eduardo
evallejo
 
Posts: 13
Joined: Thu Feb 07, 2008 10:09 pm

Re: Tdolphin Ejemplo ABM.

Postby Daniel Garcia-Gil » Sun Jan 08, 2012 12:23 am

prueba

Code: Select all  Expand view
:lappend=.t.
:save()
:skip()
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Tdolphin Ejemplo ABM.

Postby evallejo » Sun Jan 08, 2012 2:22 am

gracias Daniel, solo por curiosidad, en red esto dara problemas? ya que dos o mas usuarios estan usando esta tabla

att
Eduardo
evallejo
 
Posts: 13
Joined: Thu Feb 07, 2008 10:09 pm

Re: Tdolphin Ejemplo ABM.

Postby Daniel Garcia-Gil » Sun Jan 08, 2012 10:07 am

evallejo wrote:gracias Daniel, solo por curiosidad, en red esto dara problemas? ya que dos o mas usuarios estan usando esta tabla

att
Eduardo

no
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

problemas al usar seek con datos numericos

Postby José Ríos » Sun Jan 08, 2012 7:54 pm

Buen dia.

Siguiendo con muis pruebas en tdophin me encontre con un caso en que el metodo seek con datos numericos no encuentra numeros de mas de un digito.

Por ejemplo si tengo dados de alta los registros:

Numero Nombre
1 A
3 B
11 C

Y hago el siguiente query y despues 3 busquedas seek cobre el query

Code: Select all  Expand view

                DEFINE QUERY oQry "SELECT * FROM vendedores order by numero"

               // y despues despues hago la siguientes busquedas:

               
                If oQry:seek(2, 'Numero' ) > 0
                     msginfo('encontrado')
                else
                      msginfo('no encontrado')
                endif

                If oQry:seek(1, 'Numero' ) > 0
                     msginfo('encontrado')
                else
                      msginfo('no encontrado')
                endif

                 If oQry:seek(11, 'Numero' ) > 0
                     msginfo('encontrado')
                else
                      msginfo('no encontrado')
                endif
 

En los dos primeros casos (numero =1 y numero=2 ), el resultado de la busqueda es exitoso, pero cuando numero=11 el registro no es encontrado.

Haciendo pruebas con find el resultado de la busqueda para numero=11 es correcto.

¿Esto significa que seek no debe usarse con campos numericos?.

Saludos.

Jose Rios.
José Ríos
 
Posts: 119
Joined: Fri Nov 04, 2005 12:23 am

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: nageswaragunupudi and 45 guests