Tengo un problema en un módulo de pedidos, que me trae de cabeza ya durante unos días. El tema es el siguiente :
En el módulo tengo un listbox, donde pongo los datos de un fichero, si existe y tiene datos, sino lo pongo vacío.
En la opción nuevo pedido, creo un temporal al digitar el cliente, el cual busco, compruebo que exista y busco en una tabla
todos los artículos que compra ese cliente, si no está el temporal queda con un registro en blanco.
Bien, pues lo curioso es que en ese temporal, si añado una línea nueva y tengo que buscar el artículo porque el código digitado no existe en la tabla de artículos, el registro creado se anula y me deja la tabla temporal igual que cuando la puse al buscar el cliente, es decir, como si no hubiera hecho absolutamente nada en el temporal. Lo más curioso es que puse un inkey a ver si el registro se creaba,(hacía el dbappend), y si lo hace y muestra que el artículo buscado se ha insertado en la tabla y aparece con todos los datos que se insertan, pero después todo desaparece.
Aquí os pongo el código y las funciones que intervienen:
Code: Select all | Expand
//----------------------------------------------------------------------------//
function NuevoPedido(oDPedido )
//----------------------------------------------------------------------------//
local oDlgAlb
Local nReg,oBrw
Local oSay,oGet[7]
Local cAlias1
Private aDatos[10]
ASIZE(aClie, CLIE->( FCOUNT() ) )
AFILL(aClie,.T.)
CLIE->( IniCampo(aClie) )
CLIE->( TabCampo(aClie,0) )
CLIE->( IniCampo(aClie) )
aDatos[ 1]:= Ctod("") // Fecha
aDatos[ 2]:= Space(5) // Cliente
aDatos[ 3]:= Space(35) // Nombre
aDatos[ 4]:= Space(22) // Teléfono
aDatos[ 5]:= Space(12) // Móvil
aDatos[ 6]:= 0 // Reparto
aDatos[ 7]:= 0 // Tarifa
aDatos[ 8]:= 0 // Agente
aDatos[ 9]:= 0 // Zona
aDatos[10]:= 0 // Grupo
cAlias1 := "PTEM"
aDatos[1] := dFecha
PTEM->(dbGotop())
DEFINE DIALOG oDlgAlb RESOURCE "NUEVOPEDIDO" COLOR RGB(0,0,0),RGB(255,204,153)
*--------------------------------------------------------------------
* REDIFINIMOS LOS SAYS DEL DIALOGO DE CAPTURA DE DATOS DE LA CABECERA
*--------------------------------------------------------------------
REDEFINE SAY oSay ID 101 PROMPT "FECHA";
COLOR RGB(0,0,153),RGB(255,204,153) OF oDlgAlb
REDEFINE SAY oSay ID 102 PROMPT "Nombre";
COLOR RGB(0,0,153),RGB(255,204,153) OF oDlgAlb
REDEFINE SAY oSay ID 103 PROMPT "Teléfono";
COLOR RGB(0,0,153),RGB(255,204,153) OF oDlgAlb
REDEFINE SAY oSay ID 104 PROMPT "Móvil";
COLOR RGB(0,0,153),RGB(255,204,153) OF oDlgAlb
REDEFINE SAY oSay ID 105 PROMPT "Reparto";
COLOR RGB(0,0,153),RGB(255,204,153) OF oDlgAlb
REDEFINE SAY oSay ID 106 PROMPT "Tarifa";
COLOR RGB(0,0,153),RGB(255,204,153) OF oDlgAlb
REDEFINE SAY oSay ID 107 PROMPT "Cliente";
COLOR RGB(0,0,153),RGB(255,204,153) OF oDlgAlb
*--------------------------------------------------------------------
* REDIFINIMOS LOS GETS DEL DIALOGO DE CAPTURA DE DATOS DE LA CABECERA
*--------------------------------------------------------------------
REDEFINE GET oGet[1] VAR aDatos[ 1] ID 4001 PICTURE "@D" OF oDlgAlb READONLY UPDATE;
COLOR RGB(0,0,0),RGB(255,204,51)
REDEFINE GET oGet[2] VAR aDatos[ 3] ID 4002 PICTURE "@!" OF oDlgalb READONLY UPDATE;
COLOR RGB(0,0,153),RGB(255,204,51)
REDEFINE GET oGet[3] VAR aDatos[ 4] ID 4003 PICTURE "@!" OF oDlgAlb READONLY UPDATE;
COLOR RGB(0,0,153),RGB(255,204,51)
REDEFINE GET oGet[4] VAR aDatos[ 5] ID 4004 PICTURE "@!" OF oDlgAlb READONLY UPDATE;
COLOR RGB(0,0,153),RGB(255,204,51)
REDEFINE GET oGet[5] VAR aDatos[ 6] ID 4005 PICTURE "99" OF oDlgAlb READONLY UPDATE;
COLOR RGB(0,0,153),RGB(255,204,51)
REDEFINE GET oGet[6] VAR aDatos[ 7] ID 4006 PICTURE "99" OF oDlgAlb READONLY UPDATE;
COLOR RGB(0,0,153),RGB(255,204,51)
REDEFINE GET oGet[7] VAR aDatos[ 2] ID 4007 PICTURE "99999" OF oDlgAlb UPDATE ;
COLOR RGB(0,0,0),RGB(255,204,51);
VALID BusCliArt(aDatos[2],oDlgAlb,oBrw)
*-------------------------------------------------------------------------------
* Definimos el Browse
*-------------------------------------------------------------------------------
oBrw = TXBrowse():New( oDlgAlb )
oBrw:nColDividerStyle := LINESTYLE_BLACK
oBrw:nRowDividerStyle := LINESTYLE_BLACK
oBrw:lRecordSelector := .t.
oBrw:nHeaderLines := 2
oBrw:nDataLines := 1
oBrw:nRowSel := 1
oBrw:nMarqueeStyle := 3 //Highlight row //MARQSTYLE_HIGHLCELL
oBrw:bClrSelFocus := {||{CLR_WHITE,RGB(176,196,222 )}}
oBrw:cAlias := "PTEM"
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
oBrw:bClrSel := {|| { nRGB(0,0,0), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco
oBrw:lFastEdit := .T.
oBrw:bPastEof = {|| PTEM->(Dbappend()), oBrw:GoLeftMost(),oBrw:Refresh(),;
oBrw:aCols[ 1 ]:Edit() }
//agrega registro y "oprime" enter
* oCol = oBrw:AddCol()
* oCol:bStrData := { ||TRANSFORM(PTEM->codigo,"999999") }
* oCol:nEditType := EDIT_GET
* oCol:cHEADER := "CODIGO"
* oCol:bEditValid = {|o| if ( VAL(o:value()) == 0 , .f.,.t.) }
* oCol:bOnPostEdit := { | oCol, xVal, nKey | If( RecCount() == 0,( DbAppend(), oBrw:Refresh() ),) ,;
* If( nKey == VK_RETURN, If(BSArt(oBrw,xVal),oBrw:Refresh(),oBrw:nMoveType:=MOVE_NONE),),;
* If( nKey == VK_ESCAPE .and. PTEM->codigo=0,( PTEM->(dbDelete()),;
* PTEM->(__dbPack()),PTEM->(dbGoBottom()),oBrw:Refresh() ), ) }
oCol = oBrw:AddCol()
oCol:bEditValue := { |x| If( x == nil, PTEM->codigo, PTEM->codigo := x ) }
oCol:nEditType := EDIT_GET_BUTTON
oCol:cHEADER := "CODIGO "
oCol:addResource( "BUSCAR1" )
oCol:lBtnTransparent := .t.
oCol:nBtnBmp := 1
* oCol:bEditValid := {|o| if ( Empty(o:value()) , .f., .t.) }
oCol:bEditValid := {|o| if ( o:value()= 0 , .f., .t.) }
oCol:bEditBlock := {|nRow, nCol, oCol| oCol:Value := BusArtic() }
oCol:bOnPostEdit := { | oCol, xVal, nKey | If( RecCount() == 0,( DbAppend(), oBrw:Refresh() ),) ,;
If( nKey == VK_RETURN, If(BSArt(oBrw,xVal),oBrw:Refresh(),oBrw:GoleftMost()),),;
If( nKey == VK_ESCAPE .and. PTEM->codigo=0,( PTEM->(dbDelete()),;
PTEM->(__dbPack()),PTEM->(dbGoBottom()),oBrw:Refresh() ), ) }
oCol = oBrw:AddCol()
oCol:bStrData := { ||PTEM->articulo }
oCol:nEditType := EDIT_GET
oCol:cHEADER := "ARTICULO"
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
If( nKey == VK_RETURN, PTEM->articulo := xVal ,) }
oCol = oBrw:AddCol()
oCol:bStrData := { ||TRANSFORM( PTEM->precio,"999.999") }
oCol:nEditType := EDIT_GET
oCol:cHEADER := "PRECIO"
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
If( nKey == VK_RETURN, PTEM->precio := Val(xVal) ,) }
oCol = oBrw:AddCol()
oCol:bStrData := { ||Transform( PTEM->cajas,"9,999" ) }
oCol:nDataStrAlign := 1 //alineado a la derecha
oCol:nEditType := EDIT_GET
oCol:bEditWhen := {|| (cAlias1)->tipo = 1 }
oCol:cHEADER := "CAJAS"+CRLF+"ENTERO"
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
If( nKey == VK_RETURN, PTEM->cajas := Val(xVal) ,) }
oCol = oBrw:AddCol()
oCol:bStrData := { ||Transform( PTEM->UNIDADES,"999") }
oCol:nDataStrAlign := 1 //alineado a la derecha
oCol:nEditType := EDIT_GET
oCol:bEditWhen := {|| (cAlias1)->tipo = 1 }
oCol:cHEADER := "UNIDADES"+CRLF+"ENTERO"
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
If( nKey == VK_RETURN, PTEM->unidades := Val(xVal) ,) }
oCol = oBrw:AddCol()
oCol:bStrData := { ||Transform( PTEM->BANDEJAS,"9,999") }
oCol:nDataStrAlign := 1 //alineado a la derecha
oCol:nEditType := EDIT_GET
oCol:bEditWhen := {|| (cAlias1)->tipo = 2 }
oCol:cHEADER := "CAJAS"+CRLF+"BANDEJAS"
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
If( nKey == VK_RETURN, PTEM->bandejas := Val(xVal) ,) }
oBrw:SetRdd()
oBrw:CreateFromResource(2001)
oBrw:bKeyDown :={ | nKey | Teclas(nKey, oBrw, "PTEM") }
REDEFINE BUTTON ID 221 OF oDlgAlb ;
ACTION AltasPedi( oDlgAlb ), BorraTemp(), oDlgAlb:End()
REDEFINE BUTTON ID 223 OF oDlgAlb CANCEL ACTION BorraTemp(),oDlgAlb:End()
ACTIVATE DIALOG oDlgAlb ON PAINT oDlgAlb:aControls[14]:SetFocus() CENTERED
SysRefresh()
Return( nil )
*-------------------------------------------------------------------------------
FUNCTION BUSCLIART(cClien,oDlg,oBrw)
*-------------------------------------------------------------------------------
Local nPrecio := 0
Local nTipo := 0
cClien := PADL(ALLTRIM(cClien),5,"0")
If Val(cClien)== 0
MsgInfo("No se permiten pedidos al Cliente "+"00000","AVISO")
Return(.f.)
EndIf
CLIE->(dbSeek(cClien))
If CLIE->(Found())
aDatos[ 2] := cClien
aDatos[ 3] := CLIE->nombre
aDatos[ 4] := CLIE->telefono
aDatos[ 5] := CLIE->movil
aDatos[ 6] := BARREPARTO()
aDatos[ 7] := CLIE->tarifa
aDatos[ 8] := CLIE->agente
aDatos[ 9] := CLIE->zona
aDatos[10] := CLIE->grupo
Else
MsgInfo("No existe el cliente","AVISO")
Return(.f.)
EndIf
IF PTEM->(Flock())
PTEM->(dbZap())
EndIf
CLIAR->(dbSeek(cClien))
If CLIAR->(Found())
While CLIAR->cliente == cClien
PTEM->(dbAppend())
PTEM->codigo := CLIAR->codigo
PTEM->articulo := CLIAR->articulo
nPrecio := BARPRECIO(aDatos,CLIAR->codigo)
PTEM->precio := nPrecio
nTipo := BARTIPO(CLIAR->codigo)
PTEM->tipo := nTipo
CLIAR->(dbSkip())
If CLIAR->(Eof())
Exit
EndIf
EndDo
PTEM->(dbUnlockAll())
PTEM->(dbCommitAll())
ELSE
PTEM->(dbAppend())
EndIf
oDlg:Update()
oDlg:Refresh()
PTEM->(dbGotop())
oBrw:Refresh()
SysRefresh()
Return(.t.)
* ------------------------------------------------------------------
FUNCTION BSART(oBrw,nCodigo)
* ------------------------------------------------------------------
Local nArti := nCodigo
Local lSigue := .T.
Local xCodigo := 0
ARTI->(dbSeek(nArti))
If ARTI->(Found())
(oBrw:cAlias)->codigo := nArti
(oBrw:cAlias)->articulo := ARTI->articulo
(oBrw:cAlias)->precio := ARTI->(FIELDGET(aDatos[7]+6))
(oBrw:cAlias)->tipo := BARTIPO(nArti)
Else
nSino := MsgYesNo("Artículo no encontrado"+CRLF+"¿Desea buscarlo?","ELIJA")
If nSino
nArti := BUSARTIC()
If nArti == 0
lSigue := .F.
Else
PTEM->codigo := nArti
PTEM->articulo := ARTI->articulo
PTEM->precio := ARTI->(FIELDGET(aDatos[7]+6))
PTEM->tipo := BARTIPO(nArti)
oBrw:Refresh()
EndIf
Else
lSigue := .F.
EndIf
EndIf
SysRefresh()
inkey(5)
Return(lSigue)
*-----------------------------------------------------------------------------
Function Teclas(nKey, oBrw, cAlias)
*-----------------------------------------------------------------------------
Local nCol := oBrw:nColSel
Do Case
Case nKey == VK_DELETE
if MsgNoYes("¿Confirme borrar este registro?")
(cAlias)->(dbDelete())
(cAlias)->(dbCommitall())
oBrw:GoUp()
oBrw:Refresh()
EndIf
EndCase
Return nil
//----------------------------------------------------------------------------//
function BusArtic()
//----------------------------------------------------------------------------//
Local oLbArt, oWArtic
Local oDlgArt
Local cCodigo := 0
Local oDArti
Local nSelect := Select()
dbSelectArea("ARTI")
DATABASE oDArti
oDArti:Gotop()
DEFINE DIALOG oDlgArt RESOURCE "DLGBUSART"
REDEFINE LISTBOX oLbArt ;
FIELDS Str(oDArti:Codigo),oDArti:articulo ;
HEADERS "Codigo ","Articulo" ;
ID 101 ;
OF oDlgArt ;
COLOR CLR_BLACK, RGB( 180, 180, 180) ;
ON DBLCLICK ( cCodigo := oDArti:codigo , oDlgArt:End() ,;
dbSelectArea(nSelect) ) ;
ALIAS "ARTI"
oDlgArt:SetControl( oLbArt )
oDlgArt:bGotFocus := { || oLbArt:Refresh() }
oLbArt:bSkip = { | nRecs | oDArti:Skipper( nRecs ) }
oLbArt:lCellStyle = .F.
ACTIVATE DIALOG oDlgArt CENTERED
SysRefresh()
return( cCodigo )
Y aún más curioso, si el artículo digitado existe, pone todos los datos y sigue el proceso, si no existe, es como si volviera a digitar el cliente creando un temporal nuevo, sobre el anterior que está abierto y de forma exclusiva.
Después de añadir los datos al registro en la función BSART, he puesto un dbunlock, un dbcommit y nada, se lo pasa por el forro.
Al volver de la función BSART, si el artículo ha sido buscado, todo browse temporal desaparece y el cursor pasa al get de cliente.
¿Alguien tiene de idea del por qué en este módulo me pasa esto y en los demás que tengo esto mismo no pasa?