Problema con DELETE

Problema con DELETE

Postby fergonm » Thu Oct 23, 2008 3: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
fergonm
 
Posts: 133
Joined: Fri Nov 30, 2007 11:34 am
Location: Zaragoza (España)

Postby karinha » Thu Oct 23, 2008 4:32 pm

cNumPoliza := ( Garant )->NumPoliza
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7316
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby fergonm » Thu Oct 23, 2008 4: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
fergonm
 
Posts: 133
Joined: Fri Nov 30, 2007 11:34 am
Location: Zaragoza (España)

Postby karinha » Thu Oct 23, 2008 4:49 pm

De donde la variable viene declarada??

Tiene que declarar.

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7316
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby fergonm » Thu Oct 23, 2008 4: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
fergonm
 
Posts: 133
Joined: Fri Nov 30, 2007 11:34 am
Location: Zaragoza (España)

Postby Carlos Mora » Thu Oct 23, 2008 5: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
Last edited by Carlos Mora on Thu Oct 23, 2008 5:36 pm, edited 1 time in total.
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby karinha » Thu Oct 23, 2008 5: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
User avatar
karinha
 
Posts: 7316
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby fergonm » Thu Oct 23, 2008 5: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
fergonm
 
Posts: 133
Joined: Fri Nov 30, 2007 11:34 am
Location: Zaragoza (España)

Postby Carlos Mora » Thu Oct 23, 2008 5: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
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby karinha » Thu Oct 23, 2008 6:02 pm

MEMVAR cNumPoliza

cNumPoliza := SPACE(15)
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7316
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby Daniel Garcia-Gil » Thu Oct 23, 2008 6: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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Problema con DELETE

Postby FiveWiDi » 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.
FiveWiDi
 
Posts: 1078
Joined: Mon Oct 10, 2005 2:38 pm

Re: Problema con DELETE

Postby FranciscoA » Fri Oct 24, 2008 1: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?
User avatar
FranciscoA
 
Posts: 2112
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Postby fergonm » Fri Oct 24, 2008 9:36 am

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

Un saludo.
Saludos. Fernando
fergonm
 
Posts: 133
Joined: Fri Nov 30, 2007 11:34 am
Location: Zaragoza (España)


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Willi Quintana and 54 guests