FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Problema con DELETE
Posts: 133
Joined: Fri Nov 30, 2007 11:34 AM
Problema con DELETE
Posted: Thu Oct 23, 2008 03:39 PM

Buenas tardes:

Tengo un problema con una pequeña parte de código. Al borrar un registro, da error (BASE1003 no existe al variable cNumPoliza).

El código es:

// Programa Garantias de pólizas 2008

include "FiveWin.ch"

include "d:\personal\FWH\ts\TSBrowse\Include\TSBrowse.ch"

static oWnd

Function garan (oLb,cNumPoliza)

Local oDlg
Local oLbx
Local cVar,cFer
Local oFont
Local n

If !Garant->(DbSeek(cNumPoliza))
cFer:=MsgYesNo("No existen las garantías de póliza. Dar de alta")
ELSE
cFer:=MsgYesNo(" ¿ Desea modificar las garantías de póliza ?")
ENDIF
IF cFer==.T.
SET INDEX TO TEMPORAL

DEFINE FONT oFont NAME "Arial" SIZE 0, -12

DEFINE DIALOG oDlg FROM 3, 3 TO 24, 70 TITLE "Garantías Póliza" FONT oFont


  @ 1, 1 BROWSE oLbx SIZE 260,100 GRID

      ADD COLUMN TO oLBX;
      HEADER "Art" ;
      DATA (Garant->NumGaranti)  ;
      ALIGN DT_RIGHT

      ADD COLUMN TO oLBX;
      HEADER "Garantía" ;
      DATA OemToAnsi(Garant->Garantia)  ;
      EDITABLE;
      ALIGN DT_LEFT

      ADD COLUMN TO oLBX;
      HEADER "Capital" ;
      DATA (Garant->CapitalIni)  ;
      EDITABLE;
      PICTURE  "99,999,999.99";
      ALIGN DT_RIGHT
   @ 6.7,  1.4 BUTTON "&Nuevo " OF oDlg ACTION (AltaGaran(oLbx,cNumPoliza))
   @ 6.7,  9.4 BUTTON "&Borrar" OF oDlg ACTION DelGaran(oLbx)
   @ 6.7, 17.4 BUTTON "&Salir " OF oDlg ACTION oDlg:End()

 ACTIVATE DIALOG oDlg

EndIf

return nil
//---------------------------------------------------------------------------//
static function DelGaran( oLbx)

if MsgYesNo( "¿Está seguro de querer borrar la garantía? " + Garant->numGaranti )
DELETE
PACK

  oLbx:UpStable()
  oLbx:Refresh()  // Repaint the ListBox

endif

Return Nil

Por cierto, TEMPORAL es un índice así definido:
INDEX ON Garant->NumPoliza TO TEMPORAL;
FOR Garant->NumPoliza ==cNumPoliza DESCENDING

¿Pueden ayudarme?. Muchas gracias

Saludos. Fernando
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Problema con DELETE
Posted: Thu Oct 23, 2008 04:32 PM

cNumPoliza := ( Garant )->NumPoliza

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 133
Joined: Fri Nov 30, 2007 11:34 AM
Problema con DELETE
Posted: Thu Oct 23, 2008 04:39 PM
karinha wrote:cNumPoliza := ( Garant )->NumPoliza


Gracias por contestar, pero cNumPoliza es una variable que está pasada a la función "garan".

Un saludo
Saludos. Fernando
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Problema con DELETE
Posted: Thu Oct 23, 2008 04:49 PM

De donde la variable viene declarada??

Tiene que declarar.

Saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 133
Joined: Fri Nov 30, 2007 11:34 AM
Problema con DELETE
Posted: Thu Oct 23, 2008 04:53 PM
karinha wrote:De donde la variable viene declarada??

Tiene que declarar.

Saludos.


La variable está declarada en una función anterios y se pasa por referencia a la función Garan
Saludos. Fernando
Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Problema con DELETE
Posted: Thu Oct 23, 2008 05:30 PM

Fernando,

sospecho que el error se produce porque la variable está pasada como parámetro, es decir es una LOCAL. Los índices no pueden hacer referencia a una variable local, ni en la clave ni en el filtro, porque las expresiones que forman parte del índice se evalúan fuera del ámbito de la función donde se declara.

Prueba utilizando scopes, o bien usa las forma funcional del comando index, construyendo las expresiones y usando el valor de cNumPoliza y no por referencia.

Con Scopes, creas el índice (si no existe ya) y haces
OrdScope( 0, cNumPoliza )
OrdScope( 1, cNumPoliza )
Eso es como ponerle un filtro pero a la clave del indice. Si ya hay un indice con ese numero de poliza (que seguro existe) te ahorras el crear el indice temporal

Saludos,

Carlos

Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Problema con DELETE
Posted: Thu Oct 23, 2008 05:30 PM

Muestra en donde tu declaras la variable. Hay algun erro en esta declaracion.

Saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 133
Joined: Fri Nov 30, 2007 11:34 AM
Problema con DELETE
Posted: Thu Oct 23, 2008 05:46 PM
karinha wrote:Muestra en donde tu declaras la variable. Hay algun erro en esta declaracion.

Saludos.

Ahí va la función donde se declara la variable y el indice (marcado en rojo).


FUNCTION ModiSini(oBrw)


// Varios
LOCAL cCiaAseg := SPACE(25)
LOCAL cRefe := SPACE(7)
LOCAL nRefe := 0
LOCAL cNumPoliza := SPACE(15)
LOCAL cNumSini := SPACE(18)
LOCAL cClaveCia := SPACE(12)
LOCAL cRamo := SPACE(20)
LOCAL cCondi := SPACE(15)
LOCAL cSuperficie := SPACE(10)
LOCAL cAntig := SPACE(4)
LOCAL cNombre := SPACE(40)
LOCAL cDomicilio := SPACE(30)
LOCAL cPoblacion := SPACE(25)
LOCAL cTelefono := SPACE(10)
LOCAL cPerjudicado:= SPACE(40)
LOCAL cDomi := SPACE(30)
LOCAL cPobla := SPACE(25)
LOCAL cTele := SPACE(10)
LOCAL fFeSini := CTOD(" - - ")
LOCAL fFeNotif := CTOD(" - - ")
LOCAL fFeVisita := CTOD(" - - ")
LOCAL fFecha := DATE()
LOCAL GetList := {}
LOCAL aCia := {"LIBERTY ","PH ","ARAG "}
LOCAL CiaAseg := SPACE(25)
LOCAL cClave2 := SPACE(1)
LOCAL cImp := "N"
LOCAL cNota :=SPACE(120)
LOCAL cNota2 :=SPACE(60)
LOCAL oBrush
LOCAL aDatos :={}
LOCAL aRect, cDirPadre:=GetPVProfString("Config","PathFoto",".",cIniFile)
LOCAL oDlg,oLb, oLbfg,oChild
LOCAL oCbx, oGet
local lPr := .f.
LOCAL iLd := .f.

cRefe:=Siniestr->NumControl
CLOSE DATABASES
SELE 1
USE Siniestr NEW
SELE 2
USE Polizas NEW
SELE 3
USE Contrari NEW
SELE 4
USE Garant NEW
SELE 5
USE CiaAseg NEW
SELE 1
SET INDEX TO I1Sini
DbSeek(cRefe)
cNumSini:=Siniestr->NumSini
cNumPoliza:=Siniestr->NumPoliza
fFeSini:=Siniestr->FechaSini
fFeNotif:=Siniestr->FechaNoti
fFeVisita:=Siniestr->FechaVisit
cNota:=Siniestr->Notas3
cNota:=OemToAnsi(cNota)
SELE 2
SET INDEX TO I1Poliza
DbSeek(cNumPoliza)
cClaveCia:=Polizas->ClaveCia
cRamo:=Polizas->Ramo
cNombre:=OemToAnsi(Polizas->Nombre)
cDomicilio:=OemToAnsi(Polizas->Domicilio)
cPoblacion:=OemToAnsi(Polizas->Poblacion)
cTelefono:=Polizas->Telefono
cCondi:=Polizas->Condiciona
cSuperficie:=Polizas->Superficie
cAntig:=Polizas->Antiguedad

DEFINE BRUSH oBrush STYLE BRICKS
DEFINE DIALOG oDlg RESOURCE "Dialog_2" TITLE "Ver Siniestro" BRUSH oBrush
REDEFINE GET cRefe ID 10 OF oDlg UPDATE WHEN .F.
REDEFINE Combobox oCbx VAR cClaveCia ID 11 OF oDlg;
ITEMS aCia UPDATE

REDEFINE GET cNumSini ID 12 OF oDlg
REDEFINE BTNGET oGet VAR fFeSini PICTURE "@D" ID 13 OF oDlg ;
RESOURCE "Calen16" ;
ACTION (aRect := GetCoors(oGet:hWnd),;
fFeSini := FwCalendar(fFeSini,aRect[1],aRect[4],oDlg),oGet:Refresh())
REDEFINE BTNGET oGet VAR fFeNotif PICTURE "@D" ID 14 OF oDlg;
RESOURCE "Calen16" ;
ACTION (aRect := GetCoors(oGet:hWnd),;
fFeNotif := FwCalendar(fFeNotif,aRect[1],aRect[4],oDlg),oGet:Refresh())
REDEFINE BTNGET oGet VAR fFeVisita PICTURE "@D" ID 15 OF oDlg ;
RESOURCE "Calen16" ;
ACTION (aRect := GetCoors(oGet:hWnd),;
fFeVisita := FwCalendar(fFeVisita,aRect[1],aRect[4],oDlg),oGet:Refresh())
REDEFINE GET cNumPoliza ID 16 OF oDlG
REDEFINE GET cRamo ID 17 OF oDlg
REDEFINE GET cCondi ID 31 OF oDlg
REDEFINE GET cNombre ID 18 OF oDlg
REDEFINE GET cDomicilio ID 19 OF oDlg
REDEFINE GET cPoblacion ID 22 OF oDlg
REDEFINE GET cTelefono ID 23 OF oDlg
REDEFINE GET cSuperficie ID 30 OF oDlg
REDEFINE GET cAntig ID 29 OF oDlg
REDEFINE GET cNota ID 20 OF oDlg
SELE 1
INDEX ON Siniestr->NumCONTROL TO TEMPORAL2 FOR Siniestr->NumPoliza==cNumPoliza DESCENDING
REDEFINE LISTBOX oLbfg FIELDS Siniestr->NumControl HEADERS "Refe" ID 24 OF oDlg
SELE 4
INDEX ON Garant->NumPoliza TO TEMPORAL;
FOR Garant->NumPoliza ==cNumPoliza DESCENDING
SET INDEX TO TEMPORAL

REDEFINE BROWSE oLb GRID ON DblClick Garan(oLb,cNumPoliza) ID 21 OF oDlg

ADD COLUMN TO oLB;
HEADER "Art" ;
DATA (Garant->NumGaranti) ;
ALIGN DT_RIGHT

ADD COLUMN TO oLB;
HEADER "Garantía" ;
DATA OemToAnsi(Garant->Garantia) ;
ALIGN DT_LEFT

ADD COLUMN TO oLB;
HEADER "Capital" ;
DATA (Garant->CapitalIni) ;
PICTURE "99,999,999.99";
ALIGN DT_RIGHT

REDEFINE BUTTON ID 25 OF oDlg ACTION (iLd:=.t., iPr:=.T.,oDlg:End())
REDEFINE BUTTON ID 26 OF oDlg ACTION (oDlg:End())
REDEFINE BUTTON ID 27 OF oDlg ACTION (lPr:=.t., oDlg:End())
REDEFINE BUTTON ID 28 OF oDlg ;
ACTION BuscaImagen(cFoto:=( cDirPadre+" "+AllTrim(Left (cRefe,4))+""+AllTrim(Right(cRefe,5))))


ACTIVATE DIALOG oDlg CENTERED

if lPr
SELE 5
SET INDEX TO I1CiaAse
SEEK cClaveCia
IF .NOT. EOF()
cCiaAseg:=CiaAseg->Nombre
END IF

aDatos:={cRefe,cNumSini,cNumPoliza,fFeSini,;
fFeNotif,fFeVisita,cNota,cNumPoliza,cCiaAseg,;
cRamo,cNombre,cDomicilio,cPoblacion,cTelefono,;
cCondi, cSuperficie, cAntig}

aDatos:=imp_sini(aDatos)

End if

if iLd
Sele 1
SET INDEX TO I1Sini
DbSeek(cRefe)
IF EOF()
Siniestr->(DbAppend())
END IF

Siniestr->NumControl:=cRefe
Siniestr->NumSini:=cNumSini
Siniestr->NumPoliza:=cNumPoliza
Siniestr->FechaSini:=fFeSini
Siniestr->FechaNoti:=fFeNotif
Siniestr->FechaVisit:=fFeVisita
Siniestr->Notas3:=cNota+cNota2
REINDEX


Sele 2
SET INDEX TO I1Poliza
DbSeek(cNumPoliza)
IF EOF()
Polizas->(DbAppend())
END IF
Polizas->NumPoliza:=cNumPoliza
Polizas->ClaveCia:=cClaveCia
Polizas->Ramo:=cRamo
Polizas->Nombre:=cNombre
Polizas->Domicilio:=cDomicilio
Polizas->Poblacion:=cPoblacion
Polizas->Telefono:=cTelefono
Polizas->Condiciona:=cCondi
Polizas->Superficie:=cSuperficie
Polizas->Antiguedad:=cAntig

REINDEX


SELE 3
SET INDEX TO I1Contra
DbSeek(cRefe)
IF EOF()
Contrari->(DbAppend())
END IF
Contrari->NumControl:=cRefe
Contrari->NumPerju:="1"
Contrari->NombContra:=cPerjudicado
Contrari->Domicilio:=cDomi
Contrari->Poblacion:=cPobla
Contrari->Telefono:=cTele
REINDEX


SELE 5
SET INDEX TO I1CiaAse
SEEK cClaveCia
IF .NOT. EOF()
cCiaAseg:=CiaAseg->Nombre
END IF

aDatos:={cRefe,cNumSini,cNumPoliza,fFeSini,;
fFeNotif,fFeVisita,cNota,cNumPoliza,cCiaAseg,;
cRamo,cNombre,cDomicilio,cPoblacion,cTelefono,cCondi,;
cSuperficie, cAntig}
End If

SELE 2
SET INDEX TO I1Poliza
SELE 1
INDEX ON Siniestr->NumPoliza TO I2Sini DESCENDING
INDEX ON Siniestr->NumSini TO I3Sini
INDEX ON Siniestr->NumControl TO I1Sini DESCENDING
SET INDEX TO I1Sini, I2Sini,I3Sini
SET RELATION TO NumPoliza INTO Polizas

oBrw:UpStable()
oBrw:Refresh()
Return nil
//-------------------------------------------------------//
Saludos. Fernando
Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Problema con DELETE
Posted: Thu Oct 23, 2008 05:52 PM

Fernando,

declara la variable como PRIVATE en lugar de LOCAL, asi funciona. No soy partidario de las privates pero es en tu codigo la solucion mas rapida

Carlos

Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Problema con DELETE
Posted: Thu Oct 23, 2008 06:02 PM

MEMVAR cNumPoliza

cNumPoliza := SPACE(15)

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Problema con DELETE
Posted: Thu Oct 23, 2008 06:22 PM

no se como se explicaria tecnicamente, pero el indice lo esta creando con cNumPoliza dentro de un area de "memoria" determinada, eso no significa q cuando cambies el valor de cNumPoliza se cambie automaticamente el indice por valor de la variable, eso solo te va a servir para el momento que hiciste el INDEX

crea el indice temporal dentro de la funcion garant...
si no crea un indice principal
index on garant->NumPoliza tag Poliza to garant

abre la dbf
use garant index garant
asi siempre mantienes tus indices actualizados

y al usarlos puedes crear filtros y/o scope( que son muchos mas rapidos )

ORDSCOPE(0, cNumPoliza )
ORDSCOPE(1, cNumPoliza )

si estoy en lo correcto pero no use las palabras o explicacion tecnica adecuadas que por favor alguien me corrija, igualmente si estoy equivocado

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Problema con DELETE
Posted: Thu Oct 23, 2008 10:06 PM

Quizás llego tarde, he visto un hilo muy largo.

Intenta declarar el índice así:

INDEX ON Garant->NumPoliza TO TEMPORAL;
FOR Garant->NumPoliza == '"' + &(cNumPoliza) + '"' DESCENDING

ó así:

INDEX ON Garant->NumPoliza TO TEMPORAL;
FOR Garant->NumPoliza == '"' + cNumPoliza + '"' DESCENDING

Suerte y saludos
Carlos G.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Problema con DELETE
Posted: Fri Oct 24, 2008 01:49 AM
fergonm wrote:Buenas tardes:

Tengo un problema con una pequeña parte de código. Al borrar un registro, da error (BASE1003 no existe al variable cNumPoliza).

¿Pueden ayudarme?. Muchas gracias


Puedes mostrar la lista que da errorsys para ver en que linea está el error y a la vez, puedes señalar en tu código esa linea?
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 133
Joined: Fri Nov 30, 2007 11:34 AM
Problema con DELETE
Posted: Fri Oct 24, 2008 09:36 AM

Muchas gracias a todos, estamos en camino de solucionar el problema.

Un saludo.

Saludos. Fernando

Continue the discussion