Page 1 of 2

Buscar un registro con ADORDD

Posted: Sun Mar 03, 2019 11:06 am
by JoseLuis
Buenos dias

Estoy con un tema que me tiene frito, no soy capaz de encontrar un dato mediante ADORDD en una tabla, siempre me da algun tipo de error, o simplemente no lo busca.
Tengo el siguiente codigo completo:

Code: Select all

** ************************************
** ------------------------------------
** RUTINAS PARA LA GESTION DE Avisos
** ------------------------------------
** ************************************
#include "adordd.ch" 
#include "FiveWin.ch"
#include "Report.ch"
#include "dtpicker.ch"
#include "ord.ch"
#include "calendar.ch"
#include "xbrowse.ch"
#include 'hbcompat.ch'
STATIC oReport
//-----------------------------------------
memvar Publicas
memvar ccomentario
memvar cincidencia
memvar cruta
memvar ccodpro
memvar cpro1
memvar cdomi1
memvar ctel1
FUNCTION Paginaweb()
local cTitulo
cTitulo:="Trato de albaranes en pagina web"
Publicas:cserver1:="Localhost"
Publicas:cUser1 :="root"
Publicas:cPassword1""
Publicas:cPuerto:="3306"
Publicas:cBase:="Base"
Publicas:cTabla:="podwin"

//-------------------
   trataweb(cTitulo)
   return nil
//-------------------

///////////// AVISOS EN INTERNET
static function trataweb(ctitulo) 
local oDlg, oLbx,oBrw
LOCAL oServer
LOCAL oRs
local hdc :=CreateDc("DISPLAY","","")
local nHor:=GetDeviceCaps(hdc,8)
local nVer:=GetDeviceCaps(hdc,10)
local x1:=30
local y1:=30
local x2:=nver-160
local y2:=nHor-30
local oBar
IF ( oServer := ConectaP() ) != NIL   
  oRS = PodSet( oServer )
 DEFINE WINDOW oDlg MDICHILD ICON Publicas:oIco;
    OF Publicas:oWPpal;
    FROM x1,y1;
    TO x2,y2;
    COLOR CLR_BLACK,CLR_WHITE;
    PIXEL

  oDlg:cTitle:=cTitulo
  DEFINE BUTTONBAR oBar TOP 3D OF oDlg
    DEFINE BUTTON RESOURCE "CAMBIA" OF oBar NOBORDER MESSAGE "Subir Imagenes" ACTION (Subeimagen(oServer,oRs,oBrw),oDlg:Refresh());
            TOOLTIP "Subir Imagenes escaneadas"
    DEFINE BUTTON RESOURCE "SALIR"  OF oBar NOBORDER MESSAGE "Salir"       ACTION oDlg:END();
            TOOLTIP "Salir"
  @ 0, 0 xbrowse oBrw object oRS ;
    COLUMNS "no_pedido","no_manif","Fecha" ,"Fechapod"   ,"horapod" ,"webacces1" ,"Compania","Origen","Destino","Imagen","Importe","Segmer","Bultos" ;
    HEADERS "Orden"  ,"Albaran" ,"Fecha" ,"Fecha_ega"  ,"Hora_ega"  ,"Codigo"    ,"Nombre"  ,"Origen","Destino","Imagen","Importe","Refa"  ,"Bultos" ; 
    COLSIZES 100,60,60,60,60,80,250,250,250,20,60,150,40 ; 
    AUTOCOLS LINES CELL
    oBrw:lColDividerComplete:= .f.
    oBrw:nTop       := oDlg:nTop()
    oBrw:lKineticBrw    := .f.
    oBrw:nMarqueeStyle  := MARQSTYLE_HIGHLROW // Con cursor de todo el renglón
    oBrw:nBottom        := 152
    oBrw:nRight     := oDlg:nWidth()
    oBrw:nStretchCol    := STRETCHCOL_LAST
    oBrw:CreateFromCode()
    oDlg:oClient = oBrw
         ACTIVATE WINDOW oDlg    ;
         ON INIT oBrw:SetFocus() ;
         MAXIMIZED;
         ON RESIZE (oBrw:nWidth:=oDlg:nWidth-10,;
         oBrw:nHeight:=oDlg:nHeight-95,;
         oBrw:Refresh());
         VALID (oBrw:Close(),.t. )

 ENDIF


return nil

////-------------DESCARGA DE INTERNET
///////////////////////////////////
FUNCTION PodSet( oServer )

   LOCAL oRS, oError, cQry,cCant
   
   TRY 
      oRS = CreateObject( "ADODB.RecordSet" )        
   CATCH oError
      ? "Ha fallado el inicio!!!"
      ShowError( oError )      
      RETURN NIL
   END   

   cQry = "SELECT NO_PEDIDO,NO_MANIF,FECHA,FECHAPOD,FIRMAPOD,HORAPOD,WEBACCES1,COMPANIA,ORIGEN,DESTINO,IMAGEN,IMPORTE,SEGMER,BULTOS FROM podwin ORDER BY no_pedido"
   oRS:cursorLocation = adUseClient
   oRS:lockType       = adLockOptimistic
   oRS:cursorType     = adOpenDynamic
   oRS:source         = cQry
   oRS:activeConnection =  oServer
   
   TRY 
      oRS:open()
   CATCH oError
      ? "Ha fallado la orden de seleccion!!!"
      ShowError( oError )      
      RETURN NIL
   END   

return oRS

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

FUNCTION ConecTaP()
   LOCAL oServer   := NIL
   LOCAL cServer:=Publicas:cserver1   
   LOCAL cUser :=Publicas:cUser1    
   LOCAL cPassword :=Publicas:cPassword1
   LOCAL nPort     
   LOCAL cDBName   
   LOCAL nFlags    
   LOCAL oErr
   LOCAL cConString
   LOCAL lRet      := .T.
   LOCAL cTable

   nPort     := Publicas:cPuerto
   cDBName   := Publicas:cBase
   cTable    := Publicas:cTabla
   nFlags    := 0
   cConString := "Driver={MySQL ODBC 5.1 Driver}"    + ;
                 ";Server=" + cServer                + ;
                 ";DefaultDatabase=" + cDBName       + ;
                 ";Database=" + cDBName              + ;
                 ";Port=" + nPort                    + ;
                 ";User=" + cUser                    + ;
                 ";Password=" + cPassword            + ;
                 ";Option=3;"   
   

   TRY
     oServer := CreateObject( "ADODB.Connection" )     
   CATCH oErr
      ? "Ha fallado el inicio del Servidor!!!"
      ShowError( oErr )      
      RETURN NIL
   END   
   
   oServer:ConnecTionString := cConString
   
   TRY
     oServer:Open()
   CATCH oErr
     ? "Ha fallado la conexion con el servidor!!!"
     ShowError( oErr )
     RETURN NIL
   END   
   
RETURN oServer

//-----------------------------------------
Static function subeimagen(oServer,oRs,oBrw)
local oDlg,i,osay,oini,ofin,oboton,oboton1
local continua:=.F.
local aAlias
local cIni:= Date()
local cFin:= Date()
local norden,cAwb,cFile
aAlias:= cargaAlias()

dbUseArea(.T.,,Publicas:cUnidad+Publicas:cSubd+"\ALBARAN",aAlias[24],.T.)
    (aAlias[24])->(OrdSetFocus("Fecha"))
    (aAlias[24])->( dbGotop() )
  DEFINE DIALOG oDlg RESOURCE "DESDE" BRUSH Publicas:oBrush1 TRANSPARENT Font Publicas:oWPpal:ofont
    for i   = 10 to 11
        REDEFINE SAY osay ID i OF oDlg COLOR CLR_GREEN
    next i
    REDEFINE Dtpicker oini VAR cIni ID 101 OF oDlg 
    REDEFINE Dtpicker ofin VAR cFin ID 102 OF oDlg 
    REDEFINE BUTTON oboton ID 550   OF oDlg PROMPT "Aceptar" ;
        ACTION (Continua := .T., oDlg:End())
    REDEFINE BUTTON oboton1 ID 551 OF oDlg PROMPT   "Cancelar" ;
        ACTION (oDlg:End()) CANCEL
  ACTIVATE DIALOG oDlg CENTERED
  if Continua
    (aAlias[24])->(Ordscope(0,cIni))
    (aAlias[24])->(Ordscope(1,cFin))
    (aAlias[24])->(Dbgotop())
    do while !(aAlias[24])->(Eof())
    norden:=alltrim(str((aAlias[24])->Orden,7))
    cAwb:=PADL(norden,7,"0")
    cFile:=Publicas:cDocs+cAwb+".JPG"
    IF FILE(cFile)
        oRs:Seek("no_pedido="+norden)
        oRs:Fields("Imagen"):Value := 1
    ELSE
        oRs:Seek("no_pedido="+norden)
        oRs:Fields("Imagen"):Value := 0
    ENDIF
    (aAlias[24])->(Dbskip())
    enddo
    (aAlias[24])->(Ordscope(0,Nil))
    (aAlias[24])->(Ordscope(1,Nil))
  endif
    (aAlias[24])->(Dbclosearea())
return nil
 
Este proyecto lo estoy compilando en xharbour y creo que con la versión de Abril de 2011 de FWH, aunque tengo las posteriores, pero tengo tantas rutinas y librerías de terceros que no me merece la pena actualizar el proyecto.

A ver si algun alma caritativa me da la luz.

Un saludo

Re: Buscar un registro con ADORDD

Posted: Mon Mar 04, 2019 12:08 pm
by JoseLuis
Solamente añadir que todos los comandos como Movefirst, MoveLast, etc, funcionan perfectamente, sólamente el comando Seek, Find, Locate, que la verdad es que no sé si lo estoy haciendo del modo correcto.

Re: Buscar un registro con ADORDD

Posted: Mon Mar 04, 2019 12:55 pm
by gmart1
Creo que necesitas añadir unas comillas simples, porque la variable norden es un String.

Code: Select all

      oRs:Seek("no_pedido="+"'" + norden + "'")

Re: Buscar un registro con ADORDD

Posted: Mon Mar 04, 2019 1:14 pm
by JoseLuis
Buenas

Gracias por contestar

me da este error:
************************************************************
Application
===========
Path and name: C:\five\fuentes\gespaq08\gespaqn.Exe (32 bits)
Size: 1,456,128 bytes
Time from start: 0 hours 0 mins 38 secs
Error occurred at: 04/03/19, 14:06:53
Error description: Error ADODB.RecordSet/6 DISP_E_UNKNOWNNAME: SEEK
Args:
[ 1] = C no_pedido='1920645'
**************************************************************
Y ese número no lo debe encontrar, ya que no está en la base de datos Mysql,
pero no sé si el error es debido a que no lo encuentra, y entonces habría que hacer algo, o por el contrario es un error en la forma de construir el seek.

Saludos

Re: Buscar un registro con ADORDD

Posted: Mon Mar 04, 2019 1:35 pm
by gmart1
Yo no uso ADORDD.
Para la búsqueda por una columna uso el método find de ADO.

Code: Select all

   oRs:Find("no_pedido="+"'" + norden + "'")
Que se sitúa en la fila que cumpla la condición, si no se ha encontrado oRS:Eof es true.
No sé si te servirá.
Un saludo.

Re: Buscar un registro con ADORDD

Posted: Mon Mar 04, 2019 2:58 pm
by hmpaquito
Hola,


Ya se ve que por aquí sólo constestamos los que no usamos ADORDD.

A ver.

Yo no uso ADORDD, pero su uso es totalmente transparente.

Esto debe funcionar tal cual:
SELECT Articulos
SEEK cCodigo

Si no funciona es porque te falte poner algo al principio del programa. Creo que habia que poner la lista de indices que se iban a usar o algo asi.

En el github del proyecto habia informacion al respecto

Saludos

Re: Buscar un registro con ADORDD

Posted: Tue Mar 05, 2019 12:31 pm
by JoseLuis
Buenas

El caso es que como podeis ver en el código no es ADORDD, es ADO, lo que pasa es que estoy probando tanto con ADO como con ADORDD, y no ha manera de encontrar un dato, no soy capaz de construir un fuente que me busque.
hago de todo, añadir, reemplazar, borrar, etc, todo menos buscar. Quiero buscar en una tabla mysql un dato (en este caso un número) que se encuentra en una DBF, y en función de si lo encuentra o nó, que cambie el valor de otro campo de la tabla mysql por 0 o por 1.

Ya me estoy quemando :evil:

Re: Buscar un registro con ADORDD

Posted: Tue Mar 05, 2019 1:14 pm
by gmart1
Hola, si la búsqueda la haces por un campo numérico no necesitas las comillas simples.
Prueba a hacer

Code: Select all

oRs:Find("no_pedido="+norden)
? oRs:Fields("no_pedido"):Value, oRs:Eof
Si lo ha encontrado te mostrará en pantalla el valor norden y .f. para el Eof.
En este caso mira a ver si te falta un oRs:Update() en

Code: Select all

     oRs:Fields("Imagen"):Value := 1
    oRs:Update()
 
Un saludo.

Re: Buscar un registro con ADORDD

Posted: Tue Mar 05, 2019 3:11 pm
by Armando
José Luis

Intenta con

Code: Select all

oRs:Find("no_pedido = " + "'" + STR(norden,7,0) + "'" )
 
Nota: el número 7 lo ajustas dependiendo del tipo de campo (TINY, INTEGER, SMALLINT, etc etc) y longitud que hayas definido al crear la tabla,
y recuerda que MySQL prácticamente todo lo almacena como alfabético.

Saludos

Re: Buscar un registro con ADORDD

Posted: Wed Mar 06, 2019 9:00 am
by JoseLuis
Buenas

Mi preguta es, ¿podría ser que no encuentra el dato por los espacios?
Es decir, el dato a buscar es "1234567", y en la tabla mysql los datos de esa columna son " 1234567".
he hecho:

Code: Select all

        oRs:Find(trim("no_pedido")+" = " + "'" + norden + "'" )
 
y fallo en algo.
Luego para ver resultados con msginfo hago

Code: Select all

    msginfo(oRs:Fields("no_pedido"):trim(value))
 
y me da error al compilar

Como podría poner trim, primero para que quite los espacios en la busqueda del dato en la tabla, y luego en Fields para ver si realmente quita los espacios.

Re: Buscar un registro con ADORDD

Posted: Wed Mar 06, 2019 1:13 pm
by Armando
José Luis:

Con el ejemplo que te puse, cual fue el resultado?

Asumo que no_pedido es un campo numérico.

Saludos

Re: Buscar un registro con ADORDD

Posted: Wed Mar 06, 2019 4:40 pm
by JoseLuis
Buenas

Como te hago referencia anteriormente, lo he probado, y como te digo, el campo es alfanumérico, y para que coincidan tengo que quitar los espacios.

Si pongo oRs:Find("no_pedido"..... etc, no lo encuentra, ya que no_pedido es " 1234537", y norden es "1234567", entonces no se donde poner el trim en el Find como te comento anteriormente, a fin de que busque en la columna no_pedido, pero que quite los espacios.

oRs:Find(Trim("no_pedido")...... no funciona

Re: Buscar un registro con ADORDD

Posted: Wed Mar 06, 2019 5:01 pm
by Armando
José luis:

El tipo de campo es importante, si es alfanumérico definitivamente es por
los espacios, primero se los quitas y despues haces la busqueda, así.

Code: Select all

norden := ALLTRIM(norden)     // Primero le quitas los espacios

oRs:Find("no_pedido = " + "'" + norden + "'" )
 
Prueba y avisas.

Saludos

Re: Buscar un registro con ADORDD

Posted: Wed Mar 06, 2019 6:29 pm
by JoseLuis
Buenas

Gracias por contestar

Como te digo anteriormente, los espacios los tengo quitados en norden, el problema es que no se como quitarlos en "no_pedido", ya que es un campo de una tabla.

Re: Buscar un registro con ADORDD

Posted: Wed Mar 06, 2019 6:39 pm
by Armando
José Luis:

Ahh, entiendo.

Solo una idea, en lugar de tratar de quitar los espacios a no_pedido agrégalos
a npedido con PADL(), así igualas los valores.

Aunque en mi personal opinión, cuando los valores son alfanuméricos el control EDIT
lo debes poner con ajuste a la izquierda.

Saludos