Una pregunta muy tonta

Post Reply
JoseLuis
Posts: 359
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Una pregunta muy tonta

Post by JoseLuis »

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

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("_ los precios ","Cambio Realizado")
return nil
O almenos pensaba que en otras ocasiones lo hice asi, pero no funciona.

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

Jose Luis
Garbi
Posts: 250
Joined: Wed Nov 02, 2005 3:28 pm

Re: Una pregunta muy tonta

Post by Garbi »

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.
JoseLuis
Posts: 359
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Una pregunta muy tonta

Post by JoseLuis »

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

//*********************************
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: 359
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Una pregunta muy tonta

Post by JoseLuis »

Lo he resuelto utilizando ordwildseek():

Code: Select all

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("_ 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
User avatar
JoseAlvarez
Posts: 201
Joined: Sun Nov 09, 2014 5:01 pm

Re: Una pregunta muy tonta

Post by JoseAlvarez »

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..."
Post Reply