PDA

Ver la versión completa : Duda Visual Basic



pakoito
06/04/2008, 07:31
Estamos haciendo un sistema de gestión para una empresa de muebles y tengo un problema en el diseño:

Tengo un Data rellenado con una consulta, y una serie de txtBox asociados a sus campos, ¿hay alguna manera de meter el campo clave a mano y hacer que el Dat se reposicione en él?

Tengo alguna duda más que ya ire poniendo segun recuerde o la papa me deje.

EDIT: ¡VisualBasic 6.0!

Con-ten-to ^^

nandove
06/04/2008, 21:32
Estamos haciendo un sistema de gestión para una empresa de muebles y tengo un problema en el diseño:

Tengo un Data rellenado con una consulta, y una serie de txtBox asociados a sus campos, ¿hay alguna manera de meter el campo clave a mano y hacer que el Dat se reposicione en él?

Tengo alguna duda más que ya ire poniendo segun recuerde o la papa me deje.

EDIT: ¡VisualBasic 6.0!

Con-ten-to ^^

Si trabajas con un recordset creo recordar que tienes una instruccion find que cuelga de la jerarquia del objeto recordset...
y a las malas siempre puede situarte en un registro concreto modificando la select del data y refrescarlo(igual que las cajas de texto) en el evento lost focus de la caja de texto de la clave o en el key press cuando la tecla pulsada sea enter(depende de si quieres que se active cuando pierda el foco la caja o cuando valides con un enter, o ponlo en los dos casos)

Tambien seria bueno que controles la entrada de solo numeros en la caja de la clave y que de un mensaje si al refrescar el recordset con un id concreto, dicho id no existe if recordset.recordcount = 0 then loquesea

pakoito
06/04/2008, 23:15
El ID va a existir siempre porque viene arrastrándose de atrás, con a mano me refería a mediante código. Ahora releere el texto otro par de veces y probaré.


Otra cosa, ¿cómo se hace con una instrucción SQL que un campo autonumérico se rellene solo?

Xonaag
07/04/2008, 00:15
[...]
Otra cosa, ¿cómo se hace con una instrucción SQL que un campo autonumérico se rellene solo?

No podria asegurarlo 100% pero los campos autonuméricos se rellenan solos al crear un nuevo registro (al hacer el INSERT INTO, vamos).

Se despide Xonaag

pakoito
07/04/2008, 00:25
insert into tabla values ([¿ESPACIO, "", ''?], 'casa', 2, #11/10/2000#)

Xonaag
07/04/2008, 00:41
Puedes especificar los datos despes del nombre de la tabla:


INSERT INTO "nombre_tabla" ("columna1", "columna2", ...)
VALUES ("valor1", "valor2", ...)


Con lo que no tendrias que especificar el valor del autonumérico.

Pero como ya he dicho antes el autonumerico no es mi especialidad, ya que hace años que no lo uso.

Para saber el valor más grande que hay en una columna se puede usar el Max



SELECT MAX(campo) FORM tabla


si devuelve un valor pues le sumas 1, sino le asignas 0. Pero no se si se puede usar con un autonumérico.

Se despide Xonaag

pakoito
07/04/2008, 05:39
Ok, eso no se me había ocurrido, a ver si lo pruebo mañana.


Seguro que me sale alguna duda más, pero de momento con esto tengo para tirar...espero.

neostalker
07/04/2008, 08:47
Efectiviwonder, los campos autonuméricos se rellenan solos, por lo que no tienes que escribirlos en los "insert" o "update". Aún recuerdo mi primer día intentando llevar la cuenta de los autonuméricos para hacer las operaciones y los "inexplicables" mensajes de error, a lo que mi profesor me respondió con un pedagógico: Tú eres tonto! :quepalmo:

nandove
07/04/2008, 10:10
Todo lo que te han indicado es correcto... pero lo suyo es que al crear la tabla le digas que el primer campo es identificador de tabla y le especifiques que es un campo incremental +1

asi no te hara falta que tu programa lleve el peso de recuperar el maximo id de la tabla para sumar +1 y actualizarlo, es mas en cuanto hagas el INSERT INTO, no incluyas el campo ID, ese ya te lo da automaticamente la tabla ;)

Theck
07/04/2008, 13:59
Y ya para poner la guindilla te dejo una manera de hacer un autonumérico por SQL sin tener que hacer el campo autonumérico. Esto solo lo he probado en access pero debería funcionar con otros motores.


insert into tabla (id,campo1,campo2) select max(id)+1,'valor1','valor2' from tabla

pakoito
08/04/2008, 20:26
Vale, ya estamos terminando:

Tengo un recordset asociado a una tabla en datTabla. Tengo un segundo recordset sin asignar en una datAñadidos.

Quiero que se puedan mandar registros de datTabla a datAñadidos, y que luego esos registros puedan ser eliminados de datAñadidos si no los quiero.


He probado con clone (copia todo), y con campo a campo:

rs del datTabla
rs2 de datAñadidos

rs2.AddNew
rs2("Nombre") = rs.Fields("Nombre")
rs2("Apellido") = rs.Fields("Apellido")
rs2.Update

no me coge bien las cosas, me dice que propiedad mal usada o incluso error de debug.





Para borrar con un .Delete guarro sirve, ¿no?

TRaFuGa
08/04/2008, 21:06
una pregunta, porque usas vb 6.0??? :P
EDITO: te mando una cosa al email a ver si te sirve :)

nandove
08/04/2008, 21:37
Vale, ya estamos terminando:

Tengo un recordset asociado a una tabla en datTabla. Tengo un segundo recordset sin asignar en una datAñadidos.

Quiero que se puedan mandar registros de datTabla a datAñadidos, y que luego esos registros puedan ser eliminados de datAñadidos si no los quiero.


He probado con clone (copia todo), y con campo a campo:

rs del datTabla
rs2 de datAñadidos

rs2.AddNew
rs2("Nombre") = rs.Fields("Nombre")
rs2("Apellido") = rs.Fields("Apellido")
rs2.Update

no me coge bien las cosas, me dice que propiedad mal usada o incluso error de debug.





Para borrar con un .Delete guarro sirve, ¿no?

Aver yo en el VB6.0 era un gran CHAPUZA! pero las cosas me funcionaban, usaba los recordset enlazados a cajas UNICAMENTE para mostrar los datos de una seleccion de sql, ejemplo:


'la propiedad recordsource te permite pasar una sentencia sql como texto, y como tal puedes modificarlo para hacer la seleccion que te salga del pinganillo, la comilla simple es para sql(texto) mientras que las dobles son cadena de VB
recordset.recordsource = "select * from clientes where nombre = '" & trim(text1.text) & "'"
'refresco el recordset
recordset.refresh
'miro si tiene algun registro el recordset y si no hay doy un mensaje de error
if recordset.recordcount = 0 then
msgbox "tas colao bacalao!"
endif


por ultimo para actualizar borrar y lo que quieras usa la ejecucion asincrona con la base de datos, para ello te hace falta crearte un entorno de datos(llamemoslo "data") y dentro del entorno de datos "data" create una conexion (llamemosla "conn") con los datos de acceso a tu BD, y con estos dos objetos puede ejecutar de manera asincrona TODO lo que quieras, ejemplo:




'el objeto conn no sera utilizable si antes no lo abrimos
if data.conn.state = 0 then data.conn.open

'el objeto conn tiene la propiedad execute que te permite pasarle una cadena de texto como comando de sql.
Logicamente actualizaremos por el "ID" de la tabla que es unico y no por el nombre como en el ejemplo ;)
data.conn.execute "update clientes set apellido = '" & trim(text2.text) & "' where nombre = '" & trim(text1.text) & "'"
'despues de ejecutar, cerramos la conexion conn para liberar recursos
data.conn.close
'actualizamos el recordset con la BD mendiante un refresh
recordset.refresh


Y tendrias que poder ver tus datos actualizados en las cajas de texto... aunque a veces es necesario tambien el refrescar las cajas, dependiendo del codigo.

ESTO ES UNA GRAN CHAPUZA!!! pero lamentablemente funciona[propeller]


Edit: un ultimo apunte, asegurate de que el recorset inicial, digamos, el de mostrar datos, no dependa de la misma conexion de datos que el objeto conn, por que si no cuando lo cierres, no podras hacer el refres de los los datos ;)

Si tienes alguna duda pregunta, pero que quede claro que es una aberracion :D

pakoito
08/04/2008, 21:56
Amos a ver, hasta ahi llego, tengo conexion con base de datos DAO (otra chapuza), abierta la tabla, enlazados los dat, asociado una flexgrid y he hecho otros mil formularios con consultas aunque este se me resista.

Lo que quiero es hacer algo como la imagen adjunta pero en vez de con campos con registros de una tabla, añadiéndolos a otro recordset. No otra cosa.

Campos disponibles -> dat1 con su recordset -> asociado a una tabla en el form_load
Campos seleccionados -> dat2 -> no tiene asociación ni le he abierto recordset porque no se cuál usar.

nandove
08/04/2008, 22:06
Amos a ver, hasta ahi llego, tengo conexion con base de datos DAO (otra chapuza), abierta la tabla, enlazados los dat, asociado una flexgrid y he hecho otros mil formularios con consultas aunque este se me resista.

Lo que quiero es hacer algo como la imagen adjunta pero en vez de con campos con registros de una tabla, añadiéndolos a otro recordset. No otra cosa.

Campos disponibles -> dat1 con su recordset -> asociado a una tabla en el form_load
Campos seleccionados -> dat2 -> no tiene asociación ni le he abierto recordset porque no se cuál usar.

No se si llego a comprenderte... pero si es lo que creo, seria tan sencillo como modificar la tabla y añadir un campo "check" y segun pinches en uno de los registros de la izda, actualices dicho campo (por ejemplo a 1) y en el recordset de la derecha haz que mire a la misma tabla que la izda pero que cumpla la condicion de que el campo check = 1 de lo unico que te tienes que preocupar es de que cada vez que selecciones un registro de la tabla de la izda, actualices la tabla y refresques el recordset de la derecha. por ultimo en el unload del form, actualiza nuevamente TODA la tabla el campo check a 0(para no desvirtuar futuras selecciones...

¿Es eso lo que quieres?

pakoito
08/04/2008, 22:08
Si, eso se parece más y es una solución viable aunque un poco chacha. Mañana la pruebo, gracias ^^


¿Alguna idea más?

nandove
09/04/2008, 20:07
Si, eso se parece más y es una solución viable aunque un poco chacha. Mañana la pruebo, gracias ^^


¿Alguna idea más?

Lo dicho, yo y mis chapus :D pero funciona:lol:

otra solucion sin tocar la estructura de la tabla, seria crearte un array de integer's en el que ir acumulando los id's seleccionados del recordset de la izda, y desembocar los eventos correspondientes para construir una select que te rellene la seleccion del recordset de la dcha con tantos "OR" como id's tengas en el array ;)

¿te gusta mas esta solucion ?

< - >
¿al final se te soluciono?:confused:

pakoito
09/04/2008, 20:17
Hoy tocaba descansar, hab&#237;a practicas de c++ y no estoy como para cambiar de lenguaje despu&#233;s de 3 horas devan&#225;ndome el cocus con los punteracos.

nandove
09/04/2008, 20:21
Hoy tocaba descansar, había practicas de c++ y no estoy como para cambiar de lenguaje después de 3 horas devanándome el cocus con los punteracos.

XDDDDDDD
[Mode pitufo gruñon = ON]
Yo, ODIO los punteros!!!
[Mode pitufo gruñon = OFF]

pakoito
05/05/2008, 20:45
DAO 3.6, Access 2000:



Public Sub AddContrato(cli, tar, tot, mes) 'A&#241;adir contrato
Dim dbTaller As Database
Dim qdfConsulta As QueryDef
Set dbTaller = AccederBD()
Set qdfConsulta = dbTaller.CreateQueryDef("")
qdfConsulta.SQL = "INSERT INTO Contratos ( IdCliente, FechaCompra, Tarifa, Total, Meses, TotalActual, MesesActuales ) SELECT Contratos.IdCliente, Date() AS Expr1, Contratos.Tarifa, Contratos.Total, Contratos.Meses, Contratos.TotalActual, Contratos.MesesActuales From Contratos WHERE (((Contratos.IdCliente)=[Cliente]) AND ((Contratos.Tarifa)=[Tarifa]) AND ((Contratos.Total)=[Total]) AND ((Contratos.Meses)=[Meses]) AND ((Contratos.TotalActual)=[Total]) AND ((Contratos.MesesActuales)=[Meses]))"
qdfConsulta.Parameters!cliente = cli
qdfConsulta.Parameters!Tarifa = tar
qdfConsulta.Parameters!Total = tot
qdfConsulta.Parameters!Meses = mes
qdfConsulta.Execute
End SubMe dice que esos parameters no existen ni se pueden usar, y en el watch el count de Parameters es 1.

nandove
05/05/2008, 20:50
Me parece que el problema lo tienes en la sentencia insert into... &#191;estas seguro que el access acepta una sentencia asi?, no estoy muy seguro ni de que funcione en SQL server:confused:

&#191;que intentas hacer exactamente? &#191;hacer tanos insert into como te devuelva la select?


EDIT creo que has sido carnaza de un copy paste, un instruccion insert into tiene que tener una segunda parte que sea VALUES () y tu tienes un select donde tendrias que meter los valores &#191;?

pakoito
05/05/2008, 21:41
El error estaba en los corchetes, una vez quitados se ha acabado el problema.

Ahora si consigo que la consulta no a&#241;ada 5 filas en vez de una habr&#233; terminado el programa y estar&#225; listo para entregar...

Theck
06/05/2008, 12:32
Nando, si que se puede, si te fijas (creo que fue en este tema) ya puse una manera de hacer un autonum&#233;rico sin autonum&#233;rico usando una select como values.