Agregar registos en el mismo Form que los despliega

Gracias maestro, el código que do así
local lcCodigo, lcNombre
lcCodigo=productos.codi_prov
lcNombre=""
IF SEEK(lcCodigo, "proveedor", "idprov")
lcNombre=alltrim(proveedor.desc_prov)
endif
* asignamos valor al txtbox *
thisform.txtdescprov.value=lcNombre
release lcCodigo, lcNombre
Ya finalice la pregunta es que no estoy muy familiarizado con el foro
COntinuano con la segunda pregunta
Este formulario es el ABM que se creo en la clase pasada
Mi pregunta es
Si en este mismo form hecho con la clase miform y al cual le agregue la clase micommangroup, yo en vez de agregarle el grid le agregue los datos texbox de dos tablas productos y proveedores.
Yo puedo en este mismo formulario cuando pulso el botom nuevo que en vez de ir a un formulario nuevo para añadir un registro lo puedo hacer desde los campos que agregue en mi ABM osea en el mismo formulario donde despliego los registro de mi tabla. Y luego desde el botom de la clase guardar grabar el registro en la tabla producto y visualizarlo en el ABM o el mismo form. O forzadamente tengo que crear un formulario para añadir registros.
Ya lo intente desde el ABM pero siempre me enviaba el mensaje que el registro existía pero físicamente en la tabla el registro no existe.
Mil gracias

1 respuesta

Respuesta
1
Bueno bueno...
Veamos:
Lo que tú quieres hacer sí se puede.
Antes de entrar en tema me gustaría aclararte que las clases miform y commandgroup a las que tú haces referencias son ejemplos que utilicé para guiar a otro usuario en proceso de aprendizaje y comprensión de la funcionalidad de las clases. Es decir que no son clases completas, ni se ajustan a todas las necesidades. Están desarrolladas con un estilo de programación y en consecuencia, su funcionalidad está adaptada a los requerimientos que el usuario que hizo la consulta tenía en ese momento.
Habiendo aclarado esto paso a responder tu pregunta.
Puedes utilizar la clase miform para una gran variedad de formularios, incluido el que tú planteas. Lo que quizás no te resulte útil para tu necesidad son los eventos y métodos de la clase, que como te explicara arriba fueron diseñados para trabajar según el esquema de Formulario Maestro (indice con grid), Formularios individuales para altas, bajas y modificaciones.
Si te fijas, la clase commangroup llama a procedimientos que están definidos en la clase miform y se ajustan al esquema que te cité antes.
Para tu caso y tu necesidad puedes utilizar las clases, pero no debes llamar al "código heredado" de los botones de comando de la clase commandgroup.
Si en tu formulario creas un commandgroup basado en la clase de ejemplo y en el evento click de los botones utilizas el comando dodefault() estarás llamando al código del evento click de la definición de la clase. Es decir que el sistema evaluará la existencia de la variable p_form_name y luego intentará ejecutar el formulario cuyo nombre se almacena en dicha variable.
Si tú deseas asignar una funcionalidad diferente a los botones de comando tienes dos opciones:
1) Si ya has adoptado el estilo de programación que mencionas en tu consulta y lo aplicas a la mayoría de tus formularios te conviene editar el código de la clase commandgroup.
2) En cambio, si sueles trabajar de la otra forma, es decir con un formulario donde muestras un grid con los registros y manipulas los registros con formularios independientes te conviene programar tu código en el evento click del botón de tu formulario (sin tocar la definición de la clase)
Recuerda que lo correcto es que tú, partiendo del ejemplo, puedas desarrollar tus propias clases y les asignes la funcionalidad que necesites según tú estilo de programación.
Sigue...
Ahora sí vamos al caso concreto:
Según entiendo tú has diseñado un formulario que no tiene control grid, pero sí tiene varios controles txtbox / cmbobox, etc, en los cuales deseas mostrar la información de un solo registro Finalmente tienes un commandgroup basado en el ejemplo del que hablamos y deseas que al darle click al botón nuevo en vez de llamar a otro formulario se habiliten los controles de tu formulario para que puedas cargar los datos que se guardarán si le das click al botón guardar.
***
Bien, siendo así, debes evaluar qué funcionalidad deseas asignar a los otros botones de la clase. Para ello necesito que me brindes alguna información que me ayudará a orientarte sobre tu mejor opción.
Trata de contarme qué quieres que suceda cuando des click sobre los botones Nuevo, Editar y Eliminar.
Aguardo tus comentarios.
Tomando encuenta sus comentarios concluyo que lo del abm creado me servirá si deseo más adelante en el proyecto hacer un grid en un form el cual adiciona edita etc registros desde formularios adicionales osea que la clase micommandgrop llame a estos form. Para tales actividades.
Pero si yo deseo crear un abm que me presente los registros de una tabla en este mismo form creado bajo la clase miform debo crear una nueva clase command grup con su propio código o también puedo programar en los eventos clic de cada botom para que cuando escojo el botom nuevo me permita crear un registro desde el mismo ABM
Voy a empezar bajo esta figura y le voy comunican los resultados,
Primero voy a crear un form de entrada bajo la clase miform luego voy a crear una nueva clase commandgrop con los botones y agregarla al formulario, adiciono los texbox de registros a partir de mis tablas que tengo en mi data enviroment y después tengo que programar los botones allí esdonde no c como proceder para que no se confundan los datos de la tabla con los que estoy añadiendo en los mismos textbox.
Lo mantendré informado
Gracias
Le aclaro
Tengo un form creado con la clase miform y micommandgroup(Nuevo Editar Eliminar Buscar Filtrar Imprimir Grabar Cancelar Salir, también tengo otro commandgroup (Próximo Anterior Primero Ultimo) al mismo form le agrego campos de dos tablas indexadas que arrastro desde el data enviroment.( Tabla producto y proveedor)
Cuando pulso el botom próximo me va al sigue. Registro, el botom ultimo va al ultimo reg. y así sucesivamente, este commangroup ya esta listo
El problema es que cuando le doy nuevo en el mismo form deshabilito los botones (Nuevo Editar Eliminar Buscar Filtrar Imprimir Salir ) y habilitado grabar y cancelar pero al momento de grabar el registro que esta indexado por código del producto siempre existe y no puedo añadirlo pero físicamente en la tabla no existe, por eso le preguntaba si esto se podía hacer des el mismo form o era necesario abrir uno nuevo como vera seria algo tedioso y como que se pierde el control de los form activos en pantalla.
Gracias
Creo que su opción es acertada, aunque percibo quizás exista un error conceptual en lo que Ud. quiere hacer.
Si Ud. diseña el formulario y vincula los objetos (propiedad controlsource de los controles) a los campos de la tabla que tiene en el entorno de datos, cuando Ud. desee crear un nuevo registro desde ese formulario el único comando que podrá utilizar en el evento click del botón nuevo será append blank.
Esto puede convertirse en un inconveniente si su tabla tiene algún campo con índice del tipo principal o candidato (muy frecuentes y necesarios para crear relaciones entre las tablas). En dicho caso al ejecutar append blank el sistema puede devolverle un error, dependiendo de cómo tenga definida la integridad referencial de su base de datos.
Por favor tenga en cuenta esto !
Si Ud. desea puede crear el formulario tal como lo tiene previsto pero no vincule los objetos a los campos.
Esto que en principio puede parecer un contrasentido le permitirá que Ud. cargue los datos en su formulario para un nuevo registro sin que exista un registro en la tabla, y luego de verificar si los datos son correctos o si el usuario no ha omitido llenar algún dato (en el evento click del botón guardar) recién grabe el nuevo registro en la tabla mediante el comando insert sql.
Si desea puede pasarme el código de su botón grabar para ver el problema del error.
Usted disculpe pero es que estoy iniciando en esto
lo que me dice que no vincule los objetos a los campos lo que sucede es que yo arrasto los campos de las tablas a partir del data envisoment y el control source se carga automáticamente, en esto estoy confuncido no debo arrastrar los campos o debo crear txt nuevos.
No estoy seguro si su dirección es esta [email protected], de ser así le envío la imagen del form que deseo hacer, si no es esa la dirección si es posible brindármela para enviarle las imágenes
El botom guardar y cancelar no están porque envista de no poder hacerlo procedí a diseñar y agregar en otro form pero ya que usted me informa que si lo puedo hacer desde un mismo form voy a retroceder a cambiar el programa como el inicio.
Ojala y con las imágenes aclare más que es lo que deseo hacer y me pueda ayudar
LE envío al email anterior las imágenes
Gracias
Entiendo perfectamente.
No hay problema con arrastrar los campos al form, pero luedo de hacerlo haga un click derecho sobre cada control y seleccione propiedades. Luego busque la propiedad controlsource y borre el contenido de esta propiedad para cada control que haya creado de esta forma. Con esto está desvinculando el control del campo de la tabla!.
No creo necesario que me envíe las imágenes, pero de todos modos mi mail es [email protected]
Ya recibí su mail.
Con respecto a su comentario, lógicamente, si desvincula los campos de su tabla de los controles no podrá ver los registros hasta tanto Ud. indique si el formulario está en modo de consulta o de adición de un nuevo registro.
Si ud. utiliza los controles vinculados a la tabla ya ha pensado ¿Cómo añadirá nuevos registros a la tabla desde ese formulario? Me refiero a ¿Qué comando utilizará?.
La única forma de hacerlo será con el comando APPEND BLANK. Es decir añadir un nuevo registro en blanco a la tabla.
Si su tabla no tiene índices principales o candidatos no tendrá inconvenientes
Ok hice lo indicado pero los campos me aparecen en blanco,
ahora le agregue lo siguente a los texbox en el init
thisform.txtCodi_prod.value= productos.codi_prod
pero al darle clic a proximo la informacion no cambia
eso es lo que quiero hacer que aparazcan la informacion de los diferentes registros al hacer clic en proximo o anterior y cuando le doy al boton nuevo me aparescan los campos en blanco para incluir la informcaion del nuevo registro para despues grabarlos con el botom grabar y poder visualizar el registro creado en el mismo form
Ok, creo que mientras ud. preguntaba yo le respondía.
Por favor lea mis comentarios anteriores a su pregunta.
Cualquier duda sequimos el Lunes.
Ok muchas gracias por su tiempo
El error que recibe y que me envió por mail es debido a que se está intentando ejecutar un comando que infringe las reglas de la Integridad Referencial de la Base de Datos que Ud. debe haber definido !
Ademas, se trata del error que le anticipé en mis respuestas anteriores que podía surgir:
30/10/2010: Si Ud. diseña el formulario y vincula los objetos (propiedad controlsource de los controles) a los campos de la tabla que tiene en el entorno de datos, cuando Ud. desee crear un nuevo registro desde ese formulario el único comando que podrá utilizar en el evento click del botón nuevo será append blank.
Esto puede convertirse en un inconveniente si su tabla tiene algún campo con índice del tipo principal o candidato (muy frecuentes y necesarios para crear relaciones entre las tablas). En dicho caso al ejecutar append blank el sistema puede devolverle un error, dependiendo de cómo tenga definida la integridad referencial de su base de datos.
***
30/10/2010: Si ud. utiliza los controles vinculados a la tabla ya ha pensado ¿Cómo añadirá nuevos registros a la tabla desde ese formulario? Me refiero a ¿Qué comando utilizará?.
La única forma de hacerlo será con el comando APPEND BLANK. Es decir añadir un nuevo registro en blanco a la tabla.
Si su tabla no tiene índices principales o candidatos no tendrá inconvenientes.
***
Creo para que pueda avanzar en su proyecto debería adquirir algunos de los conocimientos básicos del desarrollo de Base de datos relacionales y del lenguaje, especialmente los comandos append blank, replace, upgrade, tableupdate, tablerevert, insert into, entre otros. Sin el dominio de estos conceptos será muy difícil poder progresar.
Como sugerencia final me permito aconsejarle que consulte la ayuda de Visual FoxPro escribiendo help en la ventana de comandos. Allí encontrará muchas de las respuestas y soluciones que busca, y lo más importante, no se verá en la necesidad de copiar los esquemas predeterminados de los ejemplos de VFP u otros.
De ningún modo pretendo desalentarlo, al contrario! Para solucionar el problema que Ud. tiene debo referirme nuevamente a lo que le expliqué en las respuestas anteriores.
Un sistema es precisamente eso un conjunto de datos organizados en una base de datos que tienen reglas y desencadenantes y restricciones. Debe conocerlas para poder comenzar a manipular datos mediante programación.
Gracias Maestro
En mi formulario inicial puse los campos enlazados a la tabla en mi controlsource permitienodme ver y navegar entre los registros (siguiente, ultimo, próximo, anterior) luego desde el botom nuevo de mi clase micommandgroup(esta clase la modifique ya que como me explico estaba hecha para el grid del ejemplo explicado) llamo a otro form el cual no tiene los campos enlazados con el control source de la tabla como me lo indico y en el botom grabar utilizo el comandoinsert to y table uptade antes de esto le indico el bufferModeOverwride en 5( osea Optimistic Table Buffering )
Luego al regresar a mi form inicial ya el registro esta grabado.
Una pregunta es factible utilizar la opcion en propiedades de cada  tabla BufferModeOverwride o es mejor indicarlo en el programa antes de grabar el registro
SET MULTILOCKS ON
INSERT INTO la_tabla(loscampos) values (campos)
=tablaupdate(.t., t)
Ahora tengo otro problemas con el path
El sistema esta en esta estructura
c:\sisadmin
Dentro de este directorio tengo los siguientes
Datos
Prgs
Clases
Form
Reports
Include
Informes
La base de datos y tablas están en el directotio datos y ekl programa principal esta en el directori prgs
le pongo set path to c:\sisadmin\Datos
Select productos
Pero me envía error que no encuentra el alias productos
gracias

Añade tu respuesta

Haz clic para o