PDA

Ver la versión completa : Datagrid



EPP
07/02/2011, 12:13
Bueno el tema es el siguiente... tengo 2 datagrid y tengo que cargar uno con datos del otro... el tema esta que cuando se repite un registro en vez de agregarlo tengo que sumar uno de sus campos y no logro que la mierda funcione.... me crea otro en vez de sumar el campo....

Estoy yendo por el camino facil pero cero ganas de pensar... no logro que recorra el fucking recorset y vaya comparando...

Nighthawk
07/02/2011, 18:07
faaaaaaaaaaaaaaaaaaaa
hace siglos ke no hablo SQL XD
lo mejor ke podes hacer, es transformar todos los registros a mayusculas, cosa ke si los tenes ke comparar como string no te tire un "distinto" porke uno este en mayuscula y el otro en minuscula.

algo de codigo de ejemplo vendria bien, para saber ke es :P

EPP
08/02/2011, 08:26
No uso SQL salvo para hacer la primer consulta y cargar el recordset despues me manejo con registros... una vez que obtengo el resultado recien voy a usar denuevo la consulta SQL para agregar los datos a la DB...

Pongo el código de selección a ver si se entiende lo que no me sale...



Private Sub DGProductos_DblClick()

Set RSTemp = New ADODB.Recordset

RSTemp.ActiveConnection = CN
strSQL = "SELECT STOCK.ID_PRODUCTO, STOCK.PRODUCTO, STOCK.PRECIO_VENTA FROM " & _
"STOCK WHERE STOCK.ID_PRODUCTO = " & CInt(DGProductos.Columns(0).Text)
RSTemp.Open strSQL, CN, adOpenDynamic, adLockOptimistic

End Sub


Ahi simplemente me trae los datos de la DB cuando hago doble click en el DATAGRID. Ese dato que me trae lo copia en un RECORDSET el tema esta en que cuando hace doble click sobre algo que ya esta cargado en el RECORDSET no quiero que lo vuelva agregar sino lo sume en un campo que se llama cantidad pero no me sale :S
Veremos hoy que onda que arranco denuevo si sale...

EPP
08/02/2011, 12:46
Veo que la sección no es la de antes...

Nighthawk
08/02/2011, 17:29
si mal no recuerdo, con el recordset tenes ke actualizar los datos sino no vas a ver el cambio.
y si keres editar un registro, lo tenes ke sacar, editarlo y plancharlo sobre el ke estaba.

o sea, el recordset es una variable grande basicamente, ke cuando cerras el programa se borra, y los datos te kedan en las tablas de base de datos.
no me acuerdo si se podia agregar campos en el recordset ke no estuvieran ya en la base, creo ke no.

si entendi bien lo ke keres hacer, tendrias ke usar 2 recordset, uno principal y uno auxiliar, y operar entre esos dos con cada registro, de forma ke uno te keda "estatico" despues de cargarlo una vez, y el otro es sobre el ke operas, y cuando tenes el resultado actualizas el estatico.

mejor pone un paso a paso hipotetico de lo ke esperas ke el usuario haga, y donde entra la funcion ke keres hacer, asi se ve ke necesitas cargar y ke no.

Althail
08/02/2011, 17:51
Que bueno que no estudie programación, todas esas letras... el bocho no me da xD!

Che cobran bien los programadores no? por que mínimo pagame 4000$ al mes para hacer todas esas boludeses u.u

EPP
09/02/2011, 09:13
si mal no recuerdo, con el recordset tenes ke actualizar los datos sino no vas a ver el cambio.
y si keres editar un registro, lo tenes ke sacar, editarlo y plancharlo sobre el ke estaba.

o sea, el recordset es una variable grande basicamente, ke cuando cerras el programa se borra, y los datos te kedan en las tablas de base de datos.
no me acuerdo si se podia agregar campos en el recordset ke no estuvieran ya en la base, creo ke no.

si entendi bien lo ke keres hacer, tendrias ke usar 2 recordset, uno principal y uno auxiliar, y operar entre esos dos con cada registro, de forma ke uno te keda "estatico" despues de cargarlo una vez, y el otro es sobre el ke operas, y cuando tenes el resultado actualizas el estatico.

mejor pone un paso a paso hipotetico de lo ke esperas ke el usuario haga, y donde entra la funcion ke keres hacer, asi se ve ke necesitas cargar y ke no.

Estoy haciendo el manejo de RECORDSET en tiempo de diseño, la finalidad es copiar en la tabla de la DB pero quiero hacerlo cuando recien tengo el resultado que espero... una alternativa sería tener una tabla temporal en la DB pero sería el camino facil y no optimo.. el Recordset lo actualizo...

A ver si te sirve lo que puse en otra web a ver que me responden...




Tengo un código VB 6.0 donde hay 2 DATAGRID (DG1 y DG2).

DG1 se carga cuando hago una consulta SQL (SELECT * FROM Productos)
La tabla Productos tiene los campos: CODIGO | NOMBRE | PRECIO
La idea es que en el EVENTO DOBLE CLICK sobre una linea del DG1 se copie a DG2. Lo que no logro es que si hago DOBLE CLICK sobre un mismo producto se sume el precio en vez de agregarme otra linea del mismo producto.

Ejemplo:
DG1
1 Linea: ID PRODUCTO (1) | PRODUCTO (PAN) | PRECIO ($3)
2 Linea: ID PRODUCTO (1) | PRODUCTO (LECHE) | PRECIO ($2)
3 Linea: ID PRODUCTO (1) | PRODUCTO (CARNE) | PRECIO ($15)

El procedimiento que quiero hacer es este...

DOBLE CLICK LINEA 1 - DOBLE CLICK LINEA 2 - DOBLE CLICK LINEA 1 - DOBLE CLICK LINEA 3

Y obtener el siguiente resultado...

DG2
1 Linea: ID PRODUCTO (1) | PRODUCTO (PAN) | PRECIO ($6)
2 Linea: ID PRODUCTO (1) | PRODUCTO (LECHE) | PRECIO ($2)
3 Linea: ID PRODUCTO (1) | PRODUCTO (CARNE) | PRECIO ($15)

Pero obtengo
1 Linea: ID PRODUCTO (1) | PRODUCTO (PAN) | PRECIO ($3)
2 Linea: ID PRODUCTO (1) | PRODUCTO (LECHE) | PRECIO ($2)
3 Linea: ID PRODUCTO (1) | PRODUCTO (PAN) | PRECIO ($3)
4 Linea: ID PRODUCTO (1) | PRODUCTO (CARNE) | PRECIO ($15)

GoD
09/02/2011, 15:56
Buenas!

En vez de crear una tabla temporal, te recomiendo que crees una Matríz y vayas guardando las cantidades de cada ID_PRODUCTO en esta.

Ejemplo:



Dim Matriz()

Redimensionala con el MAX de ID_PRODUCTO para que exista un lugar en la matríz para acumular las cantidades de cada producto.



Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "SELECT MAX(ID_PRODUCTO) AS MAX_ID FROM PRODUCTOS", cn, adOpenKeyset, adLockOptimistic

Redim Matriz(rs!MAX_ID)

rs.close
set rs = nothing


Luego en el evento Doble Click de la Grilla 1 vas acumulando las cantidades:



Private Sub DGProductos_DblClick()

Matriz(CInt(DGProductos.Columns(0).Text)) = Matriz(CInt(DGProductos.Columns(0).Text)) + 1

End Sub


A continuación en ese mismo evento codificás la parte que da de alta en la otra grilla para lo cual previamente chequeas si Matriz(CInt(DGProductos.Columns(0).Text)) >1, si te da verdadero significa que ya existe el Producto en la otra grilla (sino Matriz(CInt(DGProductos.Columns(0).Text)) debería ser igual a 1) entonces si existe te ubicás en la fila para ese ID_PRODUCTO y le actualizas el campo PRECIO con el producto entre el valor de Matriz(CInt(DGProductos.Columns(0).Text)) y el Precio Unitario.
Si Matriz(CInt(DGProductos.Columns(0).Text)) fuera igual a 1 entonces deberías darlo de alta.

Espero que te sirva y se entienda.

Saludos!

Nighthawk
09/02/2011, 18:04
Lo que no logro es que si hago DOBLE CLICK sobre un mismo producto se sume el precio en vez de agregarme otra linea del mismo producto

aaaaaah.... ahora si XD

en ese caso, tenes ke hacer como dijo God, hacete un temporal y comparas con eso.
o sea, necesitarias un bucle ke recorra todo el temporal y compare con el target del doble click y despues si encuentra el campo igual, ahi suma.

cuanto mas larga la lista, mas va a tardar en recorrerla, pero we, otra no keda.

EPP
10/02/2011, 11:03
Bueh habia escribo una banda agradeciendo lo que me aconsejaste Tio pero expiro el tiempo de session y copie pero me interrumpieron en el trabajo para que haga mi trabajo y deje de programar (unos desconsiderados jajaja) y se perdio lo que tenia escrito... en resumen te agradecia por el dato que me diste...
No me convencia como dijo Night el tema de que en el arreglo si hay muchos elementos se haga lenta la busqueda pero bueno acabo de terminar todo y pareciera que funciona pero solo tengo 4 productos cargados...
Lo de la tabla temporal fue como ultima opcion si no le encontraba solucion a esto de trabajar en la memoria y no con el motor de la base...
Sobre trabajar en la memoria me parecio que implementar el Recordset iba a ser mas rapido que trabajar con un vector dinamico pero veo que funciona de 10...

Gracias por la data y despues les comento como fue quedando ;) ojala se reactive la sección...

Nighthawk
10/02/2011, 11:15
en medio sueño se me ocurrio otra cosa:
en vez de recorrer toda la temporal y comparar los registros, podrias hacer el ekivalente de un try...catch de actionscript, entrando directamente a un registro X, escuchando el target del evento doble click.

seria (en criollo porke no me acuerdo la sintaxis XD):




Sub Grid_DoubleClick(param1, param2, param3...[uno de estos es el target])

On Error goto errhandler: <<< esto si me acuerdo ke era asi :P
TempArray( Recordset.Columns( paramTarget ) ).text =
TempArray( Recordset.Columns( paramTarget() ) ).text + 1 <<< aca lo vas a buscar y lo sumas

If False Then: <<< de aca para abajo nunca se ejecuta
errhandler: <<< label dentro del IF, y saltas el False
TempArray.push( Recordset.Columns( paramTarget ) ) <<< aca lo agregas, porke si viene aca, es ke fallo lo anterior, o sea ke el registro no existe.

End If

End Sub





VB creo ke tenia el metodo "push"... si no, es .Add, o algun otro....el metodo ke se use para agregar un espacio en un vector.

GoD
10/02/2011, 12:42
De nada EPP.
El acceso a las Matrices es super rápido, no vas a tener problemas de velocidad por mas que sean 10k de productos. Además de la forma que te lo armé no tenés necesidad de recorrer nada como cree Nighthawk, al contrario, accedés directamente a la posición (ID_PRODUCTO) en cuestión.

Saludos!

EPP
11/02/2011, 08:18
Me esta generando un archivo TMP que no me agrada porque si no se elimina va a generar un espacio en disco que no debería... será que tengo que destruir el objeto despues de terminar de usarlo?
Voy a terminar el DATAREPORT y sigo dando el diagnóstico... :)

EPP
17/02/2011, 12:20
Ya descubri que los TMP se generan cuando creo el DATAREPORT y me quedan colgados cuando se produce un error sino se destruyen... alguna solución para que se destruyan? Podría hacerlo con un proceso por lotes pero no se si da...

GoD
21/02/2011, 22:12
Los .tmp los genera VB cuando se modifica el diseño del DataReport, lo podés borrar tranquilo.
Te recomiendo, que desde el programa por ejemplo al salir y/o al entrar, barras el directorio en búsqueda de los .tmp y los elimines.

Saludos!

EPP
27/02/2011, 15:01
Gracias tio, ahora que estoy con mas tiempo retomo esto...

EPP
03/03/2011, 11:46
Pregunto que onda las librerias OCX que uso en Windows XP me funcionaran en Windows 7?
Sino voy a tener que cambiar el control DATAGRID

vofijatee
19/03/2011, 13:30
Pregunto que onda las librerias OCX que uso en Windows XP me funcionaran en Windows 7?
Sino voy a tener que cambiar el control DATAGRID

ajám, si bien desde hace varios años Visual Studio 6 no tiene más soporte, por el momento siguen siendo compatibles tanto la IDE como los runtimes con w7. Igual yo que vos me voy actualizando ja.

saludos.

EPP
22/03/2011, 11:23
ajám, si bien desde hace varios años Visual Studio 6 no tiene más soporte, por el momento siguen siendo compatibles tanto la IDE como los runtimes con w7. Igual yo que vos me voy actualizando ja.

saludos.

Ya se que debería actualizarme pero como sigo haciendo proyectos para amigos les hago con VB ;)

EPP
30/03/2011, 11:55
Le doy UP a esto porque me cago en W7 64 BITS... termine todo y resulta que los putos DATAREPORT no funcionan en 64 BITS... alguno conoce algun complemento para hacer reportes y sea compatible con 64 bits?¿ Porque la aplicación funiona de 10 pero mando el reporte y trunca...

NO QUIERO MIGRAR!

GoD
05/04/2011, 09:59
Lamentablemente no tenés muchas opciones, o empezás a usar .NET o usas por ejemplo el vmware (http://www.vmware.com/) para levantar un xp virtual dónde correr tu aplicación.

Saludos!

vofijatee
05/04/2011, 19:30
Crystal Reports

googleá: Crystal Reports vb6

EPP
07/04/2011, 09:37
Gracias Fede tengo el Crystal Report asi que voy a testear, no lo habia probado porque me dijeron que no iba a funcionar...

Gracias Tio tmb por tomarte tiempo y responder :)