Una pregunta muy tonta

Una pregunta muy tonta

Postby JoseLuis » Thu Oct 04, 2018 7:26 am

Buenas

Esto lo he utilizado en múltiples ocasiones, pero estoy ofuscado con algo y no soy capaz de resolverlo.

Lo que quiero es hacer un reemplazo global en varios registros dependiendo de dos variables, la fecha y que contengan una serie de caracteres.

Yo hago:
Code: Select all  Expand view
static function grabalo(oDlg,cfecha,cnombre,cimporte)
        dbUseArea(.T.,,Publicas:cUnidad+Publicas:cSubd+"\ALBARAN",,.F.)
        Albaran->(Ordsetfocus("Spro"))
        Albaran->(Dbgotop())
        REPLACE Albaran->Baseimpo WITH cimporte FOR Albaran->Fecha=cfecha .and. cnombre$Upper(Albaran->Spro)
        Albaran->(Dbclosearea())
        msginfo("Hemos Cambiado los precios ","Cambio Realizado")
return nil


O almenos pensaba que en otras ocasiones lo hice asi, pero no funciona.

Un saludo
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Una pregunta muy tonta

Postby Garbi » Thu Oct 04, 2018 10:24 am

Yo haría dos cosas,

primero cambiaría cfecha por ctod(cfecha), para convertir el campo cfecha a fecha si esta definida Albaran->Fecha como fecha

segundo Upper(cnombre)$Upper(Albaran->Spro) . Vamos las pondría las dos en mayúsculas por si acaso esta en minúsculas.

Espero que así te funcione.
Saludos,
Regards,

Jose Luis Alepuz
joseluis@mancomputer.com
www.mancomputer.com
Garbi
 
Posts: 291
Joined: Wed Nov 02, 2005 3:28 pm

Re: Una pregunta muy tonta

Postby JoseLuis » Thu Oct 04, 2018 12:38 pm

Buenas
Gracias por contestar

La cuestión es que cFecha ya viene formateada como fecha, y cnombre ya viene en mayusculas,
Mira la función principal de donde vienen los datos:

Code: Select all  Expand view
//*********************************
function modificacampo()
   local osay,oget,oDlg,i,oboton,oboton1,oini
   local cfecha,cnombre,cimporte:=0,continua:=.F.
   cfecha := CTOD ("01/01/"+Right(DtoC(Date()),2))
        DEFINE DIALOG oDlg RESOURCE "MODIFICACAMPO"
        for i = 10 to 12
            REDEFINE SAY osay ID i OF oDlg COLOR CLR_GREEN
        next i
        REDEFINE Dtpicker oini VAR cfecha   ID 104 OF oDlg
        REDEFINE GET oGet VAR cnombre           ID 105 OF oDlg Update
        REDEFINE GET oGet VAR cimporte      ID 106 OF oDlg Update picture "@Z 9,999.99"
        REDEFINE BUTTON oboton  ID 550 OF oDlg PROMPT "Aceptar" ;
               ACTION (grabalo(oDlg,cfecha,cnombre,cimporte),oboton:oJump:=oini,oini:setfocus())
        REDEFINE BUTTON oboton1 ID 551 OF oDlg PROMPT "Cancelar" ;
               ACTION (oDlg:End() ) CANCEL
        ACTIVATE DIALOG oDlg CENTERED
return nil


Un saludo
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Una pregunta muy tonta

Postby JoseLuis » Thu Oct 04, 2018 4:00 pm

Lo he resuelto utilizando ordwildseek():
Code: Select all  Expand view
function modificacampo()
   local osay,oget,oDlg,i,oboton,oboton1,oini
   local cfecha,cnombre,cimporte:=0,continua:=.F.
   cfecha := CTOD ("01/01/"+Right(DtoC(Date()),2))
        DEFINE DIALOG oDlg RESOURCE "MODIFICACAMPO"
        for i = 10 to 12
            REDEFINE SAY osay ID i OF oDlg COLOR CLR_GREEN
        next i
        REDEFINE Dtpicker oini VAR cfecha   ID 104 OF oDlg
        REDEFINE GET oGet VAR cnombre           ID 105 OF oDlg Update
        REDEFINE GET oGet VAR cimporte      ID 106 OF oDlg Update picture "@Z 9,999.99"
        REDEFINE BUTTON oboton  ID 550 OF oDlg PROMPT "Aceptar" ;
               ACTION (grabalo(oDlg,cfecha,cnombre,cimporte),oboton:oJump:=oini,oini:setfocus())
        REDEFINE BUTTON oboton1 ID 551 OF oDlg PROMPT "Cancelar" ;
               ACTION (oDlg:End() ) CANCEL
        ACTIVATE DIALOG oDlg CENTERED
return nil
//------------------------------
static function grabalo(oDlg,cfecha,cnombre,cimporte)
  local numero:=1
  dbUseArea(.T.,,Publicas:cUnidad+Publicas:cSubd+"\ALBARAN",,.T.)
  Albaran->(OrdSetFocus("spro"))
  Albaran->( dbGotop() )
  FastFilter( "*"+ Upper(alltrim(cnombre) ), 16 ) //El 16 para indicar el numero del Indice
  albaran->(dbgotop())
  do while !Albaran->(Eof())
      if Albaran->Fecha >= cfecha
    numero+=1
    While .not. Albaran->(Rlock()); end
          Albaran->Baseimpo:=cimporte  
    Albaran->( dbUnlock() )
      endif
        Albaran->( dbskip() )
  enddo
        Albaran->(Dbclosearea())
        msginfo("Hemos Cambiado los datos del campo ","Cambio Realizado")
return nil
//****************************************************
Function FastFilter( cCad, nOrder )
      Local nIndice := OrdNumber()
 
      Set order to nOrder
      INDEX ON &(IndexKey()) TAG _TEMP_ TO tHarbourt CUSTOM ADDITIVE MEMORY
       
      Set order to nOrder
      dbGotop()
      Do While OrdWildSeek( cCad, .T. )
         OrdKeyAdd( "_TEMP_" )
      Enddo
      OrdSetFocus( "_TEMP_" )

Return nIndice
 


Un saludo
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Una pregunta muy tonta

Postby JoseAlvarez » Tue Oct 09, 2018 9:00 pm

Saludos Jose Luis.

Creo que lo primero que hiciste esta bien, solo te falto la clausula ALL luego del REPLACE

REPLACE Albaran->Baseimpo WITH cimporte FOR Albaran->Fecha=cfecha .and. cnombre$Upper(Albaran->Spro)

REPLACE ALL Albaran->Baseimpo WITH cimporte FOR Albaran->Fecha=cfecha .and. cnombre$Upper(Albaran->Spro)
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 734
Joined: Sun Nov 09, 2014 5:01 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 8 guests

cron