Problema con DELETE
Problema con DELETE
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
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: 989
- Joined: Thu Nov 24, 2005 3:01 pm
- Location: Madrid, España
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
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
Last edited by Carlos Mora on Thu Oct 23, 2008 5:36 pm, edited 1 time in total.
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 3:01 pm
- Location: Madrid, España
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
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
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
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Re: Problema con DELETE
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.
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.
- FranciscoA
- Posts: 2163
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: Problema con DELETE
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?