Programación General > Visual FoxPro
Scroll Con Form Y Campo Unico
arielb:
ok widark podes poner el codigo aki que usas al momento de cancelar o guardar?
Widark:
Claro, y solo por hoy pondré el código con que cargo el formulario, solo es oferta :D:
Este codigo va en un metodo que cree para el formulario CargaControles:
--- Código: Text ---PARAMETERS Carpeta as String, TablaCampos as String, TablaDigitacion as StringPublic loErr AS ExceptionLocal loSuccess as Boolean, loTop as IntegerLOCAL loObjeto as String, loOrigenDatos as String, loControl as String, loPrefijo as String &&Prefijo del nombre del ControlLOCAL loTablaAbierta as String &&La tabla que se abrira para el combo Try SET MULTILOCKS ON USE FULLPATH(CURDIR()) + ALLTRIM(Carpeta) + "\" + TablaCampos IN 0 loSuccess = CURSORSETPROP("Buffering",5,TablaCampos) IF loSuccess = .T. MESSAGEBOX("Se ha conectado a la Tabla " + TablaCampos + " con exito.",64,"Enlace a Datos") SET ORDER TO Posicion COPY TO Array loCamposFijos FIELDS nomcampo,etiqueta,tipcontrol,relacion,requerido FOR Aparece = .T. EndIf loSuccess = .F. USE FULLPATH(CURDIR()) + ALLTRIM(Carpeta) + "\" + TablaDigitacion IN 0 loSuccess = CURSORSETPROP("Buffering",5) IF loSuccess = .T. MESSAGEBOX("Se ha conectado a la Tabla " + TablaDigitacion + " con exito.",64,"Enlace a Datos") SELECT 2 loTop = 38 FOR I = 1 TO ALEN(loCamposFijos,1) WAIT WINDOW "Creando los campos para la digitación." NoWait AdicionControles(ThisForm, 'lbl' + ALLTRIM(loCamposFijos(I,1)), "Label", loTop, 5,; FSIZE(ALLTRIM(loCamposFijos(I,1))) + 3, ALLTRIM(loCamposFijos(I,2))) IF loCamposFijos(I,3) = "Normal" IF TYPE(FIELD(ALLTRIM(loCamposFijos(I,1)))) = "L" loControl = "CheckBox" loPrefijo = "chk" ELSE IF FSIZE(ALLTRIM(loCamposFijos(I,1))) < 49 loControl = "TextBox" loPrefijo = "txt" ELSE loControl = "EditBox" loPrefijo = "edt" EndIf EndIf ELSE loControl = "ComboBox" loPrefijo = "cmb" EndIf loObjeto = loPrefijo + ALLTRIM(loCamposFijos(I,1)) loOrigenDatos = '"' + TablaDigitacion + "." + ALLTRIM(loCamposFijos(I,1)) + '"' AdicionControles(ThisForm, loObjeto, loControl, loTop, 99,; FSIZE(ALLTRIM(loCamposFijos(I,1))) + 3, "") ThisForm.&loObjeto..ControlSource = &loOrigenDatos ThisForm.&loObjeto..Tag = IIF(loCamposFijos(I,5) = .F.,"N","S") IF loControl = "ComboBox" loTablaAbierta = ALLTRIM(loCamposFijos(I,4)) IF NOT USED(loTablaAbierta) USE FULLPATH(CURDIR()) + "Globales\" + loTablaAbierta IN 0 EndIf loOrigenDatos = loTablaAbierta + ".descripcio,codigo" ThisForm.&loObjeto..ColumnWidths = "190,50" ThisForm.&loObjeto..BoundColumn = 2 ThisForm.&loObjeto..ColumnCount = 2 ThisForm.&loObjeto..FirstElement = 1 ThisForm.&loObjeto..RowSourceType = 6 ThisForm.&loObjeto..RowSource = loOrigenDatos EndIf loTop = loTop + ThisForm.&loObjeto..Height + 5 Next ThisForm.txtColor1.ControlSource = "Daniel.color" EndIf SELECT &TablaDigitacion EstadoControles(ThisForm, .F.) Desplazamiento (ThisForm, 92) Catch To loErr MESSAGEBOX(loErr.Message,48,"Error")EndTry Este es con el que guardo:
--- Código: Text ---Local strClase as String, intCo as Integer, loErr as Exception Try FOR intCo = 1 TO ThisForm.ControlCount IF INLIST(ThisForm.Controls(intCo).BaseClass,"Textbox","Editbox","Combobox") IF ThisForm.Controls(intCo).Tag = "S" AND ALLTRIM(ThisForm.Controls(intCo).Value) = "" Messagebox("Debe llenar " + ThisForm.Controls(intCo - 1).Caption + " para guardar.",48,"Faltan Datos") Cancel EndIf ELSE IF ThisForm.Controls(intCo).BaseClass = "Checkbox" IF ThisForm.Controls(intCo).Tag = "S" AND ThisForm.Controls(intCo).Value = .F. Messagebox("Debe llenar " + ThisForm.Controls(intCo - 1).Caption + " para guardar.",48,"Faltan Datos") Cancel EndIf EndIf EndIf Next TABLEUPDATE() IF BAdicion GO BOTTOM EndIf BAdicion = .F. BEdicion = .F. Desplazamiento (ThisForm, 92) EstadoControles(ThisForm, .F.) BotonesEdicion (ThisForm, .T.)Catch To loErr IF loErr.ErrorNo = 1884 Messagebox("Este registro esta Repetido.",16,"Dato Repetido") ThisForm.txtPosicion.value = mAnterior ELSE Messagebox(loErr.Message,48,"Error") EndIfFinally ThisForm.Refresh()EndTry y este es el de cancelar:
--- Código: Text ---TABLEREVERT() IF Bmk <> 0 GO BmkEndIf BAdicion = .F.BEdicion = .F. Desplazamiento (ThisForm, 92)EstadoControles(ThisForm, .F.)BotonesEdicion (ThisForm, .T.) ThisForm.Refresh() Muchas gracias por tu atención.
arielb:
ok que te parece si le decimos al programa que se un poco mas especifico al decirte los errores para entenderlo un poco mas
En el prg inicial (main) coloca esta linea
--- Código: Text ---ON ERROR DO fallos WITH ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), LINENO( )
y te creas un prg con el nombre fallos y le colocas estas lineas
--- Código: Text ---DO CASE CASE meRror=39 WAIT WINDOW 'Error en la linea : ' + UPPER(meSs1) + CHR(13) +; 'Encontrado en : ' + UPPER(mprog) + CHR(13) +; 'Archivo : ' + ALIAS() + CHR(13) +; 'Nota : Existen caracteres como "***.**"' AT 1,1 NOWAIT OTHERWISE j = MESSAGEBOX("El sistema causó el siguiente error :" + CHR(13) +; "Número :" + PADR(ALLTRIM(STR(meRror)),40) + CHR(13) +; "Tipo :" + PADR(meSs,40) + CHR(13) +; "Código :" + PADR(mess1,40) + CHR(13) +; "Línea :" + PADR(ALLTRIM(STR(mlIneno)),40) + CHR(13) +; "Método :" + PADR(mpRog,40),64,"")ENDCASE
Luego ejecutas el pograma desde el prg inicio y realizas lo que te está dando problema.
Widark:
Que tal Juez!
gracias por tu respuesta, ese modulo ya lo tenia, y si me saca el error que el indice esta repetido (en realidad dice que ha sido violado) en realidad lo que yo quiero es que antes de guardar me diga que ya esta repetido, en otro formulario tengo casi lo mismo, y cuando llega a la linea TABLEUPDATE() Try intercepta el error y ahí pongo mi mensage, pero en este espera hasta que se mueva, ya no se que hacer... :(
Navegación
[*] Página Anterior
Ir a la versión completa