Page 1 of 1

Problema con listbox

Posted: Wed Jun 07, 2006 3:43 pm
by Jorge Jaurena
Hola a todos.

Estoy haciendo un listbox de una dbf que esta vacia, cuando agrego registros no muestra nada a pesar de que hago todos los refresh() posibles, en cambio si la dbf comienza con un registro funciona perfectamente.

Muchas gracias.
Jorge Jaurena

Posted: Wed Jun 07, 2006 9:40 pm
by Antonio Linares
Jorge,

Por favor muéstranos el código de cómo creas el browse (listbox).

Posted: Thu Jun 08, 2006 4:40 pm
by Jorge Jaurena
*****LIST BOX CON LOS PRODUCTOS DE LA NOTA DE PEDIDO*****

REDEFINE LISTBOX oLbx;
FIELD TRAN(oDbfTemp:CODIGONP,"######"),oDbfTemp:DESCRIP,;
TRAN(oDbfTemp:CANTIDAD,"#######.####"),;
TRAN(oDbfTemp:PRECIO,"#######.####"),;
TRAN ((oDbfTemp:CANTIDAD*oDbfTemp:PRECIO),"#######.####"),"";
HEAD "Código Nota","Descripción","Cantidad","Precio","Total","";
SIZES 100,300,120,150,150,1;
ID 1000 OF oDlg1;
COLOR Negro,Blanco

REDEFINE BTNBMP Btn7 ID 300 OF oDlg1 RESOURCE "PRIMERO";
ACTION oDbfTemp:GoTop(),oLbx:GoTop(),oLbx:Refresh();
TOOLTIP "Ir a la primera fila de la lista"
REDEFINE BTNBMP Btn8 ID 301 OF oDlg1 RESOURCE "ULTIMO";
ACTION oDbfTemp:GoBottom(),oLbx:GoBottom(),oLbx:Refresh();
TOOLTIP "Ir a la ultima fila de la lista"

REDEFINE BTNBMP Btn9 ID 206 OF oDlg1 RESOURCE "NUEVO";
WHEN (.f.)
REDEFINE BTNBMP Btn10 ID 207 OF oDlg1 RESOURCE "EDITAR";
ACTION ModificarN(oDbfTemp,oLbx);
TOOLTIP "Modificar el Producto ingresado"
REDEFINE BTNBMP Btn11 ID 208 OF oDlg1 RESOURCE "ELIMINAR";
ACTION EliminarN(oDbfTemp,oLbx);
TOOLTIP "Eliminar el Producto ingresado"
REDEFINE BTNBMP Btn12 ID 209 OF oDlg1 RESOURCE "MENSAJE";
WHEN (.f.)
REDEFINE BTNBMP Btn13 ID 210 OF oDlg1 RESOURCE "FILTROS";
WHEN (.f.)
REDEFINE BTNBMP Btn14 ID 211 OF oDlg1 RESOURCE "PRINTER";
WHEN (.f.)
REDEFINE BTNBMP Btn15 ID 212 OF oDlg1 RESOURCE "SALIR";
WHEN (.f.)

oLbx:aJustify:={.t.,.f.,.t.,.t.,.t.,.f.}
oLbx:bSkip :={|nRecs|oDbfTemp:Skipper(nRecs)}

*************************************************************

Yo declaro tres bases de datos:
-----------------------------------
- La de la nota de pedido que es donde grabo los datos definitivamente:

USE NOTAPED INDEX NOTAPED1,NOTAPED2,NOTAPED3 NEW
DATABASE oDbf
oDbf:bEoF=nil
oDbf:GoBottom()

**Uso GoBottom porque necesito que se posicione en el ultimo lugar para despues incrementar el codigo en uno y asi obtener el codigo de la que seria la siguiente nota de pedido.

-La segunda base que uso es una auxiliar que siempre esta vacia que tiene la misma estructura que "NOTAPED":

USE AUXNOTA INDEX AUXNOTA1,AUXNOTA2,AUXNOTA3 NEW
DATABASE oDbfAux
oDbfAux:bEoF=nil
oDbfAux:GoTop()

Esta la uso para luego dentro del .prg declarar una base temporal que es la que uso en el browse.

- La tercera base (la temporal) es la siguiente:

Private TEMPON

TEMPON:="T"+SUBSTR(TIME(),4,2)+SUBSTR(TIME(),7,2)+".DBF"
COPY FILE DATOS\AUXNOTA.DBF TO &TEMPON

USE &TEMPON NEW
DATABASE oDbfTemp
oDbfTemp:bEoF=nil
oDbfTemp:GoTop()

- El problema es el siguiente:

Cuando tengo algo en la base de datos e ingreso una nueva nota de pedido me muestra correctamente en el browse los productos que voy ingresando, pero si zapeo o borro todos los registros de la base de datos de nota de pedido y quiero ingresar por primera vez una nota de pedido no me muestra los productos que voy ingresando en el listbox. Si los graba pero no los muestra, o sea los esta ingresando en la base de datos temporal pero no los muestra en el browse.
Ya probe con todos los refrescos posibles y sigue igual.

Lo extraño de esto es que yo estoy haciendo browse de la base temporal y no de la de nota de pedido. Abajo le envio la funcion que uso para, al ingresar una nueva nota de pedido, buscar si existe o no.

///////////////////////////////////////////////////////////////////////////////////////////////////
Function BuscaNota(oDbf,oDbfIva,oDbfTemp,oDbfCli,oLbx)
Local Nota:=vCod

IniVarN()
RefresN()

vCod:=Nota
oCod:Refresh()

oDbfTemp:GoTop()
DO WHILE !oDbfTemp:Eof()
oDbfTemp:RecLock()
oDbfTemp:Delete()
oDbfTemp:Unlock()
oDbfTemp:Skip()
ENDDO

oDbf:Seek(vCod)
IF !oDbf:Eof()
oCod:Disable()
oCli:Disable()
oNroOr:Disable()
oNomCli:Disable()
oCuitcli:Disable()
oIvaCli:Disable()
oFech:Disable()
vCli :=oDbf:CLIENTE
vNroOr:=oDbf:NROORDEN
oDbfCli:Seek(vCli)
IF !oDbfCli:Eof()
vNomCli:=oDbfCli:RAZONSOC
ELSE
vNomCli:=SPACE(60)
ENDIF
oDbfIva:Seek(oDbf:IVACLI)
IF !oDbfIva:Eof()
vIvaCli:=oDbfIva:DESCRIP
ELSE
vIvaCli:=SPACE(60)
ENDIF
vCuitCli:=oDbf:CUITCLI
vFech :=oDbf:FECHA
vNet :=oDbf:NETOGRAV
vIvaI :=oDbf:IVAI
vTotGral:=oDbf:TOTALFAC

DO WHILE !oDbf:Eof() .AND. oDbf:CODIGONP=vCod
oDbfTemp:Append()
oDbfTemp:CODIGONP:=oDbf:CODIGONP
oDbfTemp:NROORDEN:=oDbf:NROORDEN
oDbfTemp:CLIENTE :=oDbf:CLIENTE
oDbfTemp:IVACLI :=oDbf:IVACLI
oDbfTemp:CUITCLI :=oDbf:CUITCLI
oDbfTemp:FECHA :=oDbf:FECHA
oDbfTemp:LETRA :=oDbf:LETRA
oDbfTemp:PUNTOVTA:=oDbf:PUNTOVTA
oDbfTemp:NUMERO :=oDbf:NUMERO
oDbfTemp:CODPROD :=oDbf:CODPROD
oDbfTemp:DESCRIP :=oDbf:DESCRIP
oDbfTemp:CANTIDAD:=oDbf:CANTIDAD
oDbfTemp:PRECIO :=oDbf:PRECIO
oDbfTemp:TOTAL :=oDbf:TOTAL
oDbfTemp:NETOGRAV:=oDbf:NETOGRAV
oDbfTemp:IVAI :=oDbf:IVAI
oDbfTemp:TOTALFAC:=oDbf:TOTALFAC
oDbfTemp:TOMADA :=oDbf:TOMADA
oDbfTemp:Save()
oDbfTemp:Unlock()
oDbf:Skip()
ENDDO

oCli:Refresh()
oNroOr:Refresh()
oNomCli:Refresh()
oIvaCli:Refresh()
oCuitCli:Refresh()
oFech:Refresh()
oNet:Refresh()
oIvaI:Refresh()
oTotGral:Refresh()
oDbfTemp:GoTop()
oLbx:GoTop()
oLbx:Refresh()
ENDIF

oDbfTemp:GoTop()
oLbx:GoTop()
oLbx:Refresh()
Return .T.
///////////////////////////////////////////////////////////////////////////////////////////////////

Gracias por la atencion.
Saludos! Jorge Jaurena

Posted: Thu Jun 08, 2006 6:29 pm
by Antonio Linares
Jorge,

Si usas registros borrados, debes indexar usando la cláusula FOR .not. Deleted()