Page 1 of 3

Tdolphin Ejemplo ABM.

Posted: Wed Jan 04, 2012 8:39 pm
by José Ríos
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

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

Re: Tdolphin Ejemplo ABM.

Posted: Wed Jan 04, 2012 11:46 pm
by José Ríos
Corregido, con las siguientes modificaciones ya funciona el reporte:

Code: Select all

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

Re: Tdolphin Ejemplo ABM.

Posted: Wed Jan 04, 2012 11:48 pm
by Daniel Garcia-Gil
Jose

Muchas Gracias!!! :-D

Re: Tdolphin Ejemplo ABM.

Posted: Thu Jan 05, 2012 5:30 am
by José Ríos
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 _ (o columnas) en tdolphin?.

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

Saludos

Re: Tdolphin Ejemplo ABM.

Posted: Thu Jan 05, 2012 10:22 am
by Compuin
Amigos,

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

Saludos

Re: Tdolphin Ejemplo ABM.

Posted: Thu Jan 05, 2012 2:58 pm
by wmormar
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 _ (o columnas) en tdolphin?.

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

Saludos

Re: Tdolphin Ejemplo ABM.

Posted: Thu Jan 05, 2012 3:31 pm
by carloslmm
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

Re: Tdolphin Ejemplo ABM.

Posted: Thu Jan 05, 2012 3:46 pm
by José Ríos
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)

Re: Tdolphin Ejemplo ABM.

Posted: Thu Jan 05, 2012 9:06 pm
by wmormar
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

Re: Tdolphin Ejemplo ABM.

Posted: Fri Jan 06, 2012 12:29 am
by joseluisysturiz
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 _ (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()

Re: Tdolphin Ejemplo ABM.

Posted: Sat Jan 07, 2012 11:31 pm
by evallejo
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

Re: Tdolphin Ejemplo ABM.

Posted: Sun Jan 08, 2012 12:23 am
by Daniel Garcia-Gil
prueba

Code: Select all

:lappend=.t.
:save()
:skip()

Re: Tdolphin Ejemplo ABM.

Posted: Sun Jan 08, 2012 2:22 am
by evallejo
gracias Daniel, solo por curiosidad, en red esto dara problemas? ya que dos o mas usuarios estan usando esta tabla

att
Eduardo

Re: Tdolphin Ejemplo ABM.

Posted: Sun Jan 08, 2012 10:07 am
by Daniel Garcia-Gil
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

problemas al usar seek con datos numericos

Posted: Sun Jan 08, 2012 7:54 pm
by José Ríos
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

                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 _ (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.