FoxPro/Visual FoxPro - Unir dos grillas Cabacera y Detalle

   
Vista:

Unir dos grillas Cabacera y Detalle

Publicado por Ruben (56 intervenciones) el 23/10/2014 17:14:16
Buenas Tardes

Tengo un problema con el Visual Fox y quería saber si alguien me pudiese ayudar
Tengo dos tablas CABECERA Y DETALLE
la CABECERA LO CARGO EN UNA GRILLA y ahora el detalle de esa cabecera deberia de cargar en la otra Grilla grid 2

En el BeforeRowColCnage del grid 1 escribo lo siguiente

a= thisform.grid1.column1.text1.Value
slq = ""
slq = slq +"select Codigo, NumLinea, CodigoPropio, cantidad, dto, subtotal "
slq = slq +"from pedidolinea "
slq = slq +"where codigo=?a "
*slq = slq +"Order by codigo DESC "
Ok = SQLExec(conexion,slq,'consultita2')
IF ok<0
DO perror
endif
SELECT consultita2
thisform.Grid2.RecordSource="consultita2"
SCATTER memvar
thisform.Refresh


En el AffterRowColCnage del grid 1 escribo lo siguiente
SCATTER memvar
thisform.Refresh

++++++++++ Así me carga los valores del detalle en el grid dos pero atrasado es decir:
Al iniciar el formulario carga vacio el grid2
Al pasar al Regsitro 2 del Grid 1, en el Grid2 carga el registro 1
Al pasar el Registro 3 del Grid1, en el Grid2 cargar el registro 2

ese es mi problema

Desde ya muchas gracias a todos y los buenos comentarios de los cuales aprendí mucho en este tiempo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Unir dos grillas Cabacera y Detalle

Publicado por Fidel José (558 intervenciones) el 23/10/2014 20:43:53
En realidad deberías utilizar el evento AfterRowColChange.

Y un detalle
a= thisform.grid1.column1.text1.Value ** no es correcto
&& en todo caso sería, para AfterRowColChange o BeforeRowColChange. This.Column1.Text1.Value.

Lo correcto es tomar el valor del cursor. Si quieres poner algo general, usa este modo:
a = EVALUATE(this.Columns(1).Controlsource) && o sea, tomas el valor del cursor asociado, no de la interfaz.

De paso fijate si te conviene usar TEXT / ENDTEXT en lugar del encadenamiento. Algo así:

TEXT TO slq TEXTMERGE NOSHOW PRETEXT 15
SELECT CODIGO,Numlinea,codigopropio,Cantidad,
dto, subtotal
FROM PedidoLinea
WHERE CODIGO=?<<a>>
ENDTEXT
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Rube (56 intervenciones) el 23/10/2014 22:21:54
Estimado Fidel llevo 4 días detrás de esto solo quiero darte las gracias, que gracias si no mil gracias jamas me imagine que se podría utilizar ese código EVALUATE(this.Columns(1).Controlsource)

Eres un genio

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Fidel José (558 intervenciones) el 24/10/2014 01:16:40
Pero es fácil verlo
thisform.grid.Columns(x).ControlSource="cursorTal.Campotal" && la asignación del controlsource siempre es un literal. En este caso, siempre es "Cursor.Campo"

O sea:

a = Evaluate( "cursorTal.CampoTal" ) = Evaluate( thisform.grdTal.Columns(x).ControlSource )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Ruben (56 intervenciones) el 27/10/2014 15:33:02
Buenos Días

Tengo un problema necesito unir una BD con una consulta abajo dejo mi sentencia.

******Aquí realizo mi Consulta************

ok = sqlexec(siex,'select a.codigo, a.nombre, a.unicaja, a.ubicacion, b.articulo, b.barras from articulo a, barras b where a.codigo= b.articulo ','temarticulo')

SELECT temarticulo


********Comprueba el valor seleccionado en la grilla*********************************************
a = EVALUATE(this.Columns(1).Controlsource)

*****************************************************************

Consulta para cargar la grilla

ok=SQLEXEC(conexion, 'select p.Codigo, p.NumLinea, p.CodigoPropio, a.ubicacion, p.cantidad, p.dto, p.subtotal, ;
a.codigo from database1.pedidolinea p inner join temarticulo on p.codigopropio=temarticulo.codigo where p.codigo=?a ', 'consultita2')



no me sale ningun resultado: El errror me dice: Que dentro de mi Base de Datos no existe temarticulo



Desde ya muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Fidel José (558 intervenciones) el 27/10/2014 16:08:58
Y es correcto lo que dice. Por que si no veo mal, temarticulo es un cursor de visualFox y no un elemento de la base de datos.
Tal vez te convenga generar un tercer cursor sobre los dos obtenidos.
O sea, con SqlExec() estás enviando una instrucción al motor de base de datos. No tiene nada que ver con lo que tenga en memoria Fox. Sin embargo, cuando tienes los dos cursores generados (quitando en el segundo lo de "temarticulo"), puedes estudiar la forma de relacionarlos (quizá con un sql de fox, sin SqlExec.)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Ruben (56 intervenciones) el 27/10/2014 16:11:55
Hola Fidel gracias por tu pronta respuesta, me podrías poner algún ejemplo sobre como crear el tercero y solo con fox, soy nuevo en fox estoy tocando un sistema y casi no conosco mucho.

Mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Fidel José (558 intervenciones) el 27/10/2014 23:19:09
Es básicamente lo que haces con el SELECT para el motor de base de datos. Solo que va directo.
Como no sé lo que tienes que lograr, te tiro un ejemplo simple.
Suponte que tengo un cursor con ventas que tiene los campos fecha, factura, idclien, total entre otros y
otro cursor con los datos de clientes (idclien,nombre, etc) y quiero que aparezca el nombre del cliente en cada venta. El campo de relación será IDCLIEN que está en ambos cursores y en el cursor de clientes es único.

1
2
3
4
SELECT ve.fecha,ve.Factura,ve.idclien, ve.total , cli.Nombre ;
    FROM ventas as ve, clientes as cli ;
    WHERE  ve.Idclien = cli.Idclien ;
    INTO cursor curTercero READWRITE
El cursor curTercero tendrá la fecha y número de factura, el total y el Id y el nombre del cliente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Ruben Dario (56 intervenciones) el 28/10/2014 11:10:45
Excelente Fidel mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Ruben Dario (56 intervenciones) el 28/10/2014 11:18:07
Buenos Días Fidel

Me podrías ayudar a solucionar este problema que tengo

Tengo una BD. en un Servidor en el cual contiene la tabla articulos.
Esa tabla contiene un campo que se llama imagen el cual guarda la ruta
de la imagen que esta en una carpeta en el servidor.

Ahora yo tengo un programita en visual fox y lo que quiero es mostrar esas
imagenes segun el codigo, pero lo quiero mostrar en local que no se conecte
al servidor
Ejemplo
Nombre de la foto: pc001 y al uscar en local que aparesca esa foto

Me gustaria que copiase toda la foto en mi local y que luego pueda
mostrar esas fotos en visual fox pero sin guardar la ruta.

Se puede?

Mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Fidel José (558 intervenciones) el 28/10/2014 13:47:40
Depende de que tengas permisos para la carpeta del servidor donde están las fotos y siempre que estemos hablando de una LAN.
Si hablamos de una LAN, si conoces la ruta en la que se guardan las imágenes y tienes los permisos necesarios, puedes intentar con una rutina como la que sigue:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
PROCEDURE Copia_Imagen
LPARAMETERS tcFolderSource , tcFolderTarget , tcExtension
LOCAL lcFolderTarget,lcFolderSource,lcExtension,i,;
	lnFiSource,lcMensaje,lError,;
	lcFileTarget,lcFileSource,;
	lncopia,lnOmit,lcapostilla,;
	loFso as Object,oFile as Object
 
* Se recomienda Scripting.FileSystemObject
loFso=NEWOBJECT("Scripting.FileSystemObject")
 
* Test de parámetros
* Advertencia: En lugar de "\\central..." y "c:\theodore..." coloca lo que corresponda.
* También puedes devolver si los parámetros están vacíos.
 
lcFolderSource=EVL(tcFolderSource,"\\central\theodore\graphics")
lcFolderTarget=EVL(tcFolderTarget,"c:\theodore\entrada\fotos")
lcExtension=EVL(tcExtension,"jpg")
 
STORE 0 TO lnCopia,lnOmit
* Comprueba carpeta de destino
IF !loFso.FolderExists(lcFolderTarget)
	MD &lcFolderTarget
ENDIF
 
* Comprueba exitencia de carpeta fuente
IF !loFso.FolderExists(lcFolderSource)
	MESSAGEBOX("La carpeta Fuente "+lcFolderSource+" no existe!",0,"Mensaje")
	loFso=null
	RETURN
ENDIF
 
* Genera el array gaSource con las imágenes de lcFolderSource
lnFiSource=ADIR(gaSource,ADDBS(lcFolderSource)+"*."+lcExtension)
* Si lnFiSource=0, no hay imágenes extensión lcExtension
IF EMPTY(lnfiSource)
	MESSAGEBOX("No hay imágenes en "+lcFolderSource,0,"Mensaje")
	loFso=null
	RETURN
ENDIF
 
 
* Comienza el bucle de lectura
lcMensaje=""
lError=.f.
TRY
	LOCAL loex as Exception
	FOR i=1 TO lnfiSource
		lCopia=.t.
		lcFileSource=FORCEPATH(gaSource[i,1],lcFolderSource)
		lcMensaje="Copiando "+LOWER(lcFileSource)+" a "+LOWER(lcFolderTarget)
 
		ofile=loFso.GETFILE(lcFileSource)
		ltSource=ofile.DateLastModified
		lcfileTarget=FORCEPATH(gaSource[i,1],lcFolderTarget)
 
		IF loFso.FileExists(lcFileTarget)
			* si existe el archivo en destino, comprueba las fechas
			ofile=loFso.GETFILE(lcFileTarget)
			ltTarget=ofile.DateLastModified
			IF ltSource <= ltTarget
				lnOmit = lnOmit + 1
				lcopia=.f.
			ENDIF
 
 
		ENDIF
		IF lCopia
			WAIT lcMensaje WINDOW AT 12,15 NOWAIT
			loFso.CopyFile(lcFileSource , ADDBS(lcFolderTarget) )
			WAIT CLEAR
			lnCopia = lnCopia + 1
		ENDIF
 
	ENDFOR
CATCH TO loex
	lError= .t.
	loex.UserValue=PROGRAM()+CHR(13)+lcMensaje+CHR(13)
	lcMensaje="Se produjo un error"+CHR(13);
		+loex.UserValue+CHR(13);
		+loex.Message+CHR(13);
		+"Error Nro "+TRANSFORM(loex.ErrorNo)+CHR(13);
		+"Linea "+TRANSFORM(loex.LineNo)
FINALLY
	lcApostilla=TRANSFORM(lncopia)+" Archivos copiados"+CHR(13);
		+TRANSFORM(lnomit)+" Archivos omitidos."
	oFile=null
	loFso=null
	MESSAGEBOX(IIF(lError,lcMensaje,"Proceso Terminado"+CHR(13)+lcApostilla),0,"Mensaje")
ENDTRY
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Ruben Dario (56 intervenciones) el 28/10/2014 14:54:56
Fidel donde pongo esa rutina, creo un programa y si es asi como llamo al programa, por que me da error

no existe el programa me dice

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Fidel José (558 intervenciones) el 28/10/2014 16:26:27
Pues hombre, elige:
a) En un prg donde tengas tus funciones
b) En el formulario en que lo necesitas (metodo del form)
c) En una clase custom que uses para funciones generales. (método de clase)

la convocatoria cambiará de acuerdo a donde decidas ponerlo. Si es en un form, será Thisform.Copia_imagen()
Si es en un prg, el prg debe estar abierto con SET PROCEDURE TO lcnombreDelprg
Si es una clase custom, la tienes que levantar como objeto
oCust=newobject("custClase","cNameLib.vcx2")
oCust.Copia_Imagen()
oCust=null

Tu decides.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Ruben Dario (56 intervenciones) el 28/10/2014 17:09:45
Buenas Tardes Fidel

Antes que nada agradecerte pro el tiempo que me dedicas

El Código que me pasaste lo puse en u metodo del formulario por que me gustaría que se ejecute apenas inicia el formulario. Y me da el siguiente error

Los metodos y Eventos no pueden contener procedimientos o definiciones de clases anidadas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Fidel José (558 intervenciones) el 28/10/2014 22:44:46
Si lo pones como método del formulario o de una clase cualquiera, no debes poner la sentencia PROCEDURE.
Suponte que el método se llama Copia_imagen y la primer linea será
LPARAMETERS tcFolderSource , tcFolderTarget , tcExtension

Cuando la llames:
* Define las variables
lcCarpetaFuente="\\SERVIDOR\Carpeta\SubCarpeta"
lcCarpetaDestino="C:\tuRutaAplicacion\CarpetaDeFotos
lcExtensionFoto="jpg" && o la que fuere.

Thisform.Copia_Imagen( lcCarpetaFuente , lcCarpetaDestino , lcExtensionFoto )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Ruben Dario (56 intervenciones) el 07/11/2014 10:54:42
Fidel Buenos Días

Excelente tu respuesta

Tengo otra duda. La carpeta fotos lo tengo en el servidor. El programita que estoy haciendo esta en un portátil esa portátil solo se va a conectar a la red un rato. Bien ahora hay alguna posibilidad de que se cree el la portatil una carpeta temporal, donde cargue la foto y luego yo consulte desde ahí la foto, puesto que no interesa copiar la foto a la portatil, ya que son poco mas de 50 mil fotos. Y el tema es que al poner el código de barra aparesca la foto de ese producto.

Muchas gracias Fidel

Saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Fidel José (558 intervenciones) el 07/11/2014 15:14:17
No entiendo por qué no direccionas la carpeta del servidor directamente.
Suponte que el servidor tiene una IP fija, digamos , 192.168.0.104 y tengo permisos para una carpeta "DC" dentro de la cual tengo una subcarpeta "Fidel" y quiero mostrar una fotografía archivo TheodoreBig.jpg que está en esa carpeta.
Para un control image llamado "imgTeo" sería
thisForm.imgTeo.Picture="\\192.168.0.104\dc\Fidel\TheodoreBig.jpg"

Si no conozco el IP, pero conozco el nombre de red del server, y tengo la carpeta compartida con sus permisos,
this.Parent.imgTeo.Picture="\\Servidor\dc\Fidel\TheodoreBig.jpg"

Y no necesitas copiar la imagen a ninguna parte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Ruben Dario (56 intervenciones) el 07/11/2014 15:18:29
el Tema esta que la portatil solo se conecta a la red un rato digamos que por la mañana en ese momento el tiene que actualizar las fotos. luego lo llevan a una NAVE (otro sitio donde no hay red, ni internet, ni nada), y hay deben de trabajar con el sistema y consultando las fotos, con el articulo, un compañero lo hizo en visual Basic pero pero el ya no esta y yo no entiendo de Visual Basic nada, apenas manejo el visual fox
saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Fidel José (558 intervenciones) el 07/11/2014 15:42:29
Y no habíamos desarrollado la rutina "Copia_imagen" para eso?
Si te fijas, las 50.000 fotos las tendrás que copiar una sola vez para tenerlas disponibles cuando estés fuera de línea. Luego, debes correr la rutina diariamente para tomar las fotos nuevas.
La carpeta no puede ser temporal porque tienes que direccionar ahí la propiedad Picture del control que corresponda (image, container, etc).
La ventaja de Copia_imagen es que si no tienes fotos nuevas, solo tardará el tiempo de buscar si hay fotos nuevas en la carpeta del servidor. Y siempre te quedarán todas las imágenes en la Laptop. No hay magia.
De lo contrario tendrían que mandar un cable a la Nave y poner un router inalámbrico (802.11) dentro de la nave. Con un poco de suerte se tiene una conexión más o menos estable (hay que ver la interferencia y la temperatura ambiente).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Unir dos grillas Cabacera y Detalle

Publicado por Ruben Dario (56 intervenciones) el 07/11/2014 15:45:26
Ok muchas gracias Fidel entonces hay que copiar las fotos no hay de otra.

Saludos amigo, ahora solo me faltaría a ver lo de la grilla

Abrazos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar