Page 1 of 1

Numeracion consecutiva de codigo (SOLUCIONADO)

Posted: Tue Feb 15, 2011 3:20 pm
by Compuin
Amigos del foro,

Estoy tratando de crear un codigo que me genere numeracion automatica el registro nuevo siguiente, es decir, cada vez que ingrese un nuevo registro, asigne un nuevo numero de codigo en forma consecutiva.

Aca el codigo que estoy utilizando

cCODANT := BANCO->BCO_CODIGO

@ 1,1 GET oCodigo VAR CODBCO OF oDlg SIZE 40, 10 ;
VALID (CODBCO := StrZero( Val( CODBCO), 12 ), CODBCO: = cCODANT+1, oCodigo:Refresh(), .T. )

STATIC FUNCTION BCONUEVO(TNUEVO)

IF TNUEVO
NREG:=BANCO->(RECNO())

CODBCO := SPACE(12)
NOMBCO := SPACE(30)
CTABCO := SPACE(30)

ELSE

NREG:=BANCO->(RECNO())
CODBCO := BANCO->BCO_CODIGO
NOMBCO := BANCO->BCO_DESCRI
CTABCO := BANCO->BCO_CUENTA
ENDIF

RETURN (.T.)

Re: Numeracion consecutiva de codigo

Posted: Tue Feb 15, 2011 5:13 pm
by Pedro
Hola
Cuando estes en la opción de Altas, busca primero el último código que tienes
BCO->(dbGoBottom())-----> ir al final de la tabla
CODBCO := VAL(BCO->CODBCO) +1 ---------> tomar el último código y sumarle uno
CODBCO := StrZero(VAl(CODBCO),12)----> Si ademas quieres ponerlo con todos los ceros

y después

@ 1,1 GET oCodigo VAR CODBCO OF oDlg SIZE 40, 10 ;
VALID (CODBCO := StrZero( Val( CODBCO), 12 ), CODBCO: = cCODANT+1, oCodigo:Refresh(), .T. )

la lectura del get corespondiente

Re: Numeracion consecutiva de codigo

Posted: Tue Feb 15, 2011 5:22 pm
by Compuin
Pedro, siguiendo tu sugerencia deberia quedar asi,.

STATIC FUNCTION BCONUEVO(TNUEVO)

IF TNUEVO
NREG:=BANCO->(RECNO())
BANCO->(DBGOBOTTOM()) //-----> ir al final de la tabla
CODBCO := VAL(BANCO->CODBCO) +1

CODBCO := SPACE (12)
NOMBCO := SPACE(30)
CTABCO := SPACE(30)

ELSE

NREG:=BANCO->(RECNO())
CODBCO := BANCO->BCO_CODIGO
NOMBCO := BANCO->BCO_DESCRI
CTABCO := BANCO->BCO_CUENTA
ENDIF

RETURN (.T.)

Solo que me arroja error con CODBCO := VAL(BANCO->CODBCO) +1 al decir que variable no existe

Re: Numeracion consecutiva de codigo

Posted: Tue Feb 15, 2011 5:34 pm
by Pedro
Disculpa, puse CODBCO, que es tu variable, para que tu pusieras ahí el nombre del campo, que veo que es BCO_CODIGO
Más o menos así

Code: Select all

STATIC FUNCTION BCONUEVO(TNUEVO)

IF TNUEVO
NREG:=BANCO->(RECNO())
BANCO->(DBGOBOTTOM()) //-----> ir al final de la tabla
CODBCO := VAL(BANCO->BCO_CODIGO) +1
CODBCO := StrZero(CODBCO,12)
NOMBCO := SPACE(30)
CTABCO := SPACE(30)

ELSE

NREG:=BANCO->(RECNO())
CODBCO := BANCO->BCO_CODIGO
NOMBCO := BANCO->BCO_DESCRI
CTABCO := BANCO->BCO_CUENTA
ENDIF

RETURN (.T.)

Re: Numeracion consecutiva de codigo

Posted: Tue Feb 15, 2011 5:39 pm
by Compuin
Pedro,

Excelente tu aporte. De esa manera funciona..ahora... todavia muestra el cursos en el codigo cuando este deberia estar en NOMBCO ya que CODBCO es llenado en forma automatica al dar de Alta....como posiciono el cursor en el siguiente campo?

Re: Numeracion consecutiva de codigo

Posted: Tue Feb 15, 2011 5:46 pm
by Pedro
El que el cursor se quede en el campo es porque espera la validación del usuario, es decir el enter que lo valide, si no deseas que el usuario valide el código que tú ya le das, creo que debes poner un messagepara que tome el enter , algo así PostMessage( ::hWnd, WM_KEYDOWN, 13 ) ,o no validarlo y directamente ir al segundo get.

Re: Numeracion consecutiva de codigo

Posted: Tue Feb 15, 2011 5:48 pm
by Compuin
Ok muchas gracias por tu apoyo.

Re: Numeracion consecutiva de codigo (SOLUCIONADO)

Posted: Tue Feb 15, 2011 5:53 pm
by Compuin
Como puedo ir directamente al segundo Get????

Re: Numeracion consecutiva de codigo (SOLUCIONADO)

Posted: Tue Feb 15, 2011 6:05 pm
by Pedro
No lo he probado , pero intenta, una vez salgas de la función BANCO NUEVO poner oGet:SetFocus(2) que supongo será el siguiente get
Tambien puedes probar, poniendo en el primer get este valid y quitar el otro
Valid (oGet:KillFocus(), oGet:SetFocus(2),.t.)

Re: Numeracion consecutiva de codigo (SOLUCIONADO)

Posted: Tue Feb 15, 2011 6:09 pm
by Compuin
Ok probare y te estare comentando.

Gracias

Re: Numeracion consecutiva de codigo (SOLUCIONADO)

Posted: Tue Feb 15, 2011 8:41 pm
by joseluisysturiz
Saludos, auqnue parece ya conseguistes la solcion vas a tener problema si eliminas el ultimo registro, ya que te va a dar como creacion el mismo numero eliminado, para eevitar eso, en mi caso, uso una DBF con numeros de controles la cual llamo control, alli tengo un campo que se llama por decir algo cod_cliente, ese campo se va a incrementando cuando el usuario ya da el toque final de grabar o salvar el registro, y solo si es nuevo, si es modificacion no lo toco, asi me permito la opcion de poder comenzar a enumerar mis clientes, proveedores, numero de factura, recibos de pago, etc, desde el numero que yo quiera, y tengo mayor control ya que puedo tocar esa DBF sin tocar la DBF de mis maestros, llamole a los clientes y demas nombrados, es solo una idea mas y funciona super bien, cualquier duda puedo enviarte un ejemplo...

Re: Numeracion consecutiva de codigo (SOLUCIONADO)

Posted: Tue Feb 15, 2011 8:51 pm
by Compuin
Gracias Jose Luis,

Podrias por favor enviarme el ejemplo que me comentas?

Gracias de antemano

Re: Numeracion consecutiva de codigo (SOLUCIONADO)

Posted: Tue Feb 15, 2011 9:18 pm
by joseluisysturiz
ESTES ES EL CODIGO MANEJADOR DE LA DBF...

#include "FiveWin.ch"
#include "Folder.ch" // PARA USO DEL folder

FUNCTION fldconfig() // MAESTRO CONFIGURACIONES (constantes)

LOCAL oGetF1 := Array (15),; // GET FOLDER 2
oBtnCONFIG := Array (2) // BARRA DE BOTONES

PUBLIC oConfig := TGenerales() // VARIABLE PUBLICA DEFINIDA EN CLASES.PRG

DEFINE WINDOW oConfig:oWnd TITLE "Modulo: ARCHIVOS - Maestro Configuraciones" OF oDatos:oWndPPAL MDICHILD NO SYSTEMENU NOZOOM

SET MESSAGE OF oConfig:oWnd TO "Configuraciones y Constantes... " 2007

DEFINE DIALOG oConfig:oDlg RESOURCE "DLG_FOLDER" OF oConfig:oWnd // DEFINICION DEL oDLG PRINCIPAL

REDEFINE FOLDER oConfig:oFld ID 401 OF oConfig:oDlg; // DEFINICION DEL oFOLDER
PROMPT "Constantes"; // PESTAÑAS DEL FOLDER
DIALOGS "Config-01"

/////////////////////////////
DBSELECTAREA("jlconfig") // MAESTRO CONFIG
jlconfig->( OrdSetFocus(1) )
jlconfig->( DBGOTOP() )

DATABASE oConfig:oDbf
oConfig:oDbf:GOTOP()
oConfig:oDbf:LOAD()

////////////////////////////

// INICIO BARRA DE BOTONES

DEFINE BUTTONBAR oConfig:oBar SIZE 50, 50 OF oConfig:oWnd UPDATE 2007 // DEFINO BARRA BOTONES
oConfig:oBar:bRClicked := {|| NIL } // DESACTIVA BARRA DE BOTONES NAVEGUE BOTON DERECHO

DEFINE BUTTON oBtnCONFIG[1] OF oConfig:oBar UPDATE NOBORDER FILENAME oDatos:rBMP+"SALVAR32.BMP"; // BOTON BARRA - GUARDAR/ACTUALIZAR
ToolTip "Guardar/Actualizar";
MESSAGE "Guardar / Actualizar Datos";
ACTION ( grabacfg( oConfig:oDbf ),; // GUARDO DATOS
MSGWAIT("Espere, Guardando Datos...", " ATENCIÓN", 1) )

DEFINE BUTTON oBtnCONFIG[2] OF oConfig:oBar UPDATE NOBORDER FILENAME oDatos:rBMP+"SALIR32.BMP"; // BOTON BARRA - SALIR
ToolTip "Salir";
MESSAGE "Retornar al Menu Principal";
ACTION ( oConfig:oWnd:END() )


// INICIO oGETs 1ra.PESTAÑA oConfig:oFld

REDEFINE GET oGetF1[3] VAR oConfig:oDbf:cfg_codalu; // CODIGO ALUMNO CONSECUTIVO
ID 203 OF oConfig:oFld:aDialogs[1] UPDATE PICTURE "9999999";
VALID ( oConfig:oDbf:cfg_codalu >=0 )

REDEFINE GET oGetF1[4] VAR oConfig:oDbf:cfg_codpro; // CODIGO PROFESOR CONSECUTIVO
ID 204 OF oConfig:oFld:aDialogs[1] UPDATE PICTURE "9999999";
VALID ( oConfig:oDbf:cfg_codpro >=0 )

REDEFINE GET oGetF1[5] VAR oConfig:oDbf:cfg_codcon; // CODIGO CONGRESO CONSECUTIVO
ID 205 OF oConfig:oFld:aDialogs[1] UPDATE PICTURE "9999999";
VALID ( oConfig:oDbf:cfg_codcon >=0 )

REDEFINE GET oGetF1[7] VAR oConfig:oDbf:cfg_numfac; // NUMERO FACTURA CONSECUTIVO
ID 207 OF oConfig:oFld:aDialogs[1] UPDATE PICTURE "9999999";
VALID ( oConfig:oDbf:cfg_numfac >=0 )

REDEFINE GET oGetF1[8] VAR oConfig:oDbf:cfg_contro; // NUMERO CONTROL
ID 208 OF oConfig:oFld:aDialogs[1] UPDATE PICTURE "@K !!-!!!!!!!" READONLY


// FIN oGET F I N G E T s


ACTIVATE DIALOG oConfig:oDlg NOWAIT; // ACTIVA DLG Y LO UBICO DEBAJO DEL BTNBAR
ON INIT ( oConfig:oDlg:MOVE(oBtnCONFIG[2]:nWidth, 0) );
VALID( !GETKEYSTATE( VK_ESCAPE ) ) // DESHABILITA SALGA DEL DIALOGO CON Esc

ACTIVATE WINDOW oConfig:oWnd; // VENTANA TOMA TAMAÑO DEL DIALOGO
ON INIT ( oConfig:oWnd:SetSize(oConfig:oDlg:nWidth, oConfig:oDlg:nHeight + oBtnCONFIG[2]:nWidth) )

RETURN .T. // FIN MAESTRO CONFIGURACIONES (constantes)

------------------------------------------------------------------------------------------------------------------------------------
ACA COMO ACCEDO Y HAGO EL CODIGO CONSECUTIVO, HAY FUNCIONES QUE NO SON NECESARIAS YA QUE NO TIENE NADA
QUE VER CON EL AUMENTO DEL CODIGO...

DEFINE BUTTON oBtnALUM[5] OF oBarALUM UPDATE NOBORDER FILENAME oDatos:rBMP+"SALVAR32.BMP"; // BOTON BARRA GUARDAR/ACTUALIZAR
ToolTip "Guardar/Actualizar";
MESSAGE "Guardar / Actualizar Datos";
WHEN (nSALVAR > 1);
ACTION ( IIF( oDatos:lAPPEND == .T. ,;
(oDbfCONFIG:cfg_codalu := jlconfig->cfg_codalu + 1 ,;
oDbfALUM:alu_codigo := oDbfCONFIG:cfg_codalu ,;
nCodAlu := oDbfALUM:alu_codigo ,;
oDbfALUM:alu_nivel := nRadNIVEL ,;
oDbfALUM:alu_fecha := DATE() ,;
grabacfg( oDbfCONFIG ), .T.), .T. ) ,; // ASIGNO CODIGO AL NUEVO REGISTRO (se controla en jlconfig)
graba(oDbfALUM, oBrwALUM) ,; // GUARDO DATOS Y RETORNO AL xBROWSE PPAL.
addnotas(nCodAlu, oDbfNOTAS, oBrwNOTAS, oDatos:lAPPEND) ,; // ADICIONO LAS MATERIAS A dbf NOTAS Y LUEGO CARGO EL array
oFldALUM:SetOption(1) ,;
jlalumno->( OrdSetFocus(2) ) ,; // COLOCA DE NUEVO INDICE A LOS NOMBRES-EN VALIDACION codigo NO SE REPITA LO PONGO EN EL 1
oBrwALUM:GOTOP(), oBrwALUM:REFRESH() ,; // VOY 1er REGISTRO Y FERESCO xBRW
nSALVAR := 1 )
----------------------------------------------------------------------------------------------------------------------------------
ACA UNA IMAGEN...ESPERO TE SIRVA, CUALQUIER DUDA O MEJORIA ES BIENVENIDA....

Image

Uploaded with ImageShack.us

Re: Numeracion consecutiva de codigo (SOLUCIONADO)

Posted: Wed Feb 16, 2011 12:53 am
by Compuin
Gracias Jose Luis,

Lo probare y te dare mis comentarios.

Saludos.

Re: Numeracion consecutiva de codigo (SOLUCIONADO)

Posted: Sat Mar 05, 2011 7:19 pm
by ender
para elegir un get en concreto para poner el foco
oGet[1]:oJump := oGet[2]
oGet[2]:SetFocus()
y en el ini
odlg:bStart = {|| if ( lalta , oGet[1]:SetFocus() , oGet[3]:SetFocus() ) }