Clarion - Generar archivo de texto

 
Vista:

Generar archivo de texto

Publicado por Eduardo (9 intervenciones) el 31/03/2010 01:13:36
Necesito generar un archivo de texto con registros de longitud variable. Con el Driver de ASCII en Clarion 5, no consigo ese resultado ya que si los datos a grabar tienen distinta longitud, me deja espacios al final de cada registro. ¿Alguna idea o solución?
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
sin imagen de perfil

RE:Generar archivo de texto

Publicado por Marcelo Madelon (572 intervenciones) el 31/03/2010 13:19:27
Eduardo

Me queda la curiosidad de para que necesitas trabajar con un registro variable. A eso lo usábamos en Cobol en la década el 90.
Te paso una rutina para tomar los datos de un campo excepto los espacios al final.
No se si se puede, tampoco trabajé con registros de largo variable con Clarion.
Espero te sirva. Avisame si te sirvió.......

LOC:Variable = ARC:Registro ! Muevo el registro a una variable String(120)

I# = 120 ! Inicializo con el valor 120 que coincide con el largo de LOC:Variable
LOOP C# = 120 TO 1 BY -1 ! recorro desde el ultimo asia el primero

If Sub(LOC:String,C#,1) Not > '' ! Si no encontro algun caracter en la posición C# resto 1 a I#
I# -= 1
Else ! de lo contratio
Break ! sale del loop
End ! If
End ! Loop

! tomo la parte que tiene datos descartando los espacios al final
! te lo muestro en un message para que lo puedas ver

Message ('lo que encontré es: ' & sub(LOC:String,1,I#)) ! Muestro la variable y no el registro

! en el help te indica como tomar parte de un string
! SUB('ABCDEFGHI',1,1) returns 'A'
! SUB('ABCDEFGHI',-1,1) returns 'I'
! SUB('ABCDEFGHI',4,3) returns 'DEF'
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

RE:Generar archivo de texto

Publicado por Eduardo (9 intervenciones) el 01/04/2010 00:52:56
Marcelo, te comento que necesito trabajar con un reg.variable, porque debo pasarle datos a un prog. externo a mi sistma, y al que no tengo posibilidad de modificarle nada.
Sólo puedo pasarle datos en formato ASCII y con caracteres tabuladores
y de fin de registro, pero sin espacio detrás, porque si no, me muestra un error de formato de importación.
La rutina que utilizo es:
!-----------------------------------------------------------------------------------------
CLEAR(EXP1:RECORD) ! arch.de salida
EXP1:Campo = '' ! único camo del registro de salida

EXP1:Campo = CLIP(FORMAT(PRO1:Codigo,@S20)) & CHR(09) & '1' & CHR(09) & 'M' & CHR(09) & |
CLIP(LEFT(FORMAT(L_Final,@N12.2B))) & CHR(9) & '100' & CHR(13) & CHR(10)

Access:ExportaASCII.Insert() !Add to target
!-----------------------------------------------------------------------------------------

Lo que me queda por hacer es, definir un gran registro al que le muevo Byte x Byte los datos de salida, de tal manera que pueda contener más de uno de los registros de mi sistema, manejando a mano cuando quedan truncados y continuan en el siguiente registro del arch. ASCII
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
sin imagen de perfil

RE:Generar archivo de texto

Publicado por Marcelo Madelon (572 intervenciones) el 01/04/2010 01:25:40
Eduardo,
¿Probaste declarar el campo EXP1:Campo como CSTRING?
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
sin imagen de perfil

RE:Generar archivo de texto

Publicado por Marcelo Madelon (572 intervenciones) el 01/04/2010 20:25:27
Eduardo,
Cuando me referia a que uses Csting era con un archivo Basic delimitado por comas por que ascii no te permitie CSTRING
Hice una prueba. Este es el código que use:

! Grabo el archivo ArchTxt que es un BASIC y en Full Path Name: -->> ArchTxt.TXT
! tiene un solo campo ARC:Campo y es CSTIRNG
! al archivo este lo podes abrir con cualquier editor
! aca listo el archivo de pedido y el detalle correspondiente a cada uno
! Pedid001 tiene los datos de la cabecera
! Pedid002 tiene los datos del detalle
! el rango de fechas lo marca LOC:FechaDesde / LOC:FechaHasta

! Recorro los pedidos desde FechaDesde hasta FechaHasta
Clear (PE1:Record)
PE1:Fecha = LOC:FechaDesde
SET (PE1:KeyFecha,PE1:KeyFecha) ! Me posiciono
LOOP UNTIL Access:Pedid001.Next() or PE1:Fecha > LOC:FechaHasta ! leo hasta que encuentre una fecha superior a Fecha Hasta
! Leo los datos del cliente
CLI:CodCliente = PE1:CodCliente ! Leo los datos del cliente
IF Access:Clientes.Fetch(CLI:KeyCodCliente)
CLI:ApellidoNombre = 'Cliente Inexistente' ! Me manejo asi por que es solo un ejemplo
CLI:Direccion = 'Zona Urbana' !
END
! Armo el campo y grabo datos de la cabecera separado por ','
Clear(ARC:Record)
ARC:Campo = ('NOTA de PEDIDO FECHA: '& ',' & format (PE1:Fecha,@d6)& ',' & Clip(CLI:ApellidoNombre) & CHR(13) & CHR(10))
Access:ArchTxt.Insert()

! Recorro
Clear(PE2:Record)
PE2:VectorPedido = PE1:VectorPedido
SET (PE2:KeyVectorPedido,PE2:KeyVectorPedido) ! me posiciono
LOOP UNTIL Access:Pedid002.Next() or PE2:VectorPedido <> PE1:VectorPedido

ART:CodArticulo = PE2:CodArticulo ! Leo Articulos
IF Access:Articulos.Fetch(ART:KeyCodArticulo)
ART:Denominacion = 'Artículo Inexistente' ! Tener en cuenta que esto es solo un ejemplo. Si en una empresa
END ! Presentas un programa asi vas a durar poco
! Armo el campo y grabo datos del detalle del pedido
Clear(ARC:Record)
ARC:Campo = (Format(PE2:Cantidad,@N9.2) & ',' & ART:Denominacion & ',' & Format(PE2:ImporteUnitario,@N12.2) & ',' & Format(PE2:ImporteTotal,@N12.2) & CHR(13) & CHR(10))
Access:ArchTxt.Insert()
END ! Loop Pedid002
END ! Loop Pedid001






! lo que sigue es lo que levante con un editor de texto (notepad) del archivo txt



"NOTA de PEDIDO FECHA: ,31/03/2010,PEREZ MARIA LUISA
"
" 1.00,dulce de leche , 121.00, 121.00
"

Podes camiar las comas por espacios ; o cualquier otro caracter
Si no te soluciona puede que te sirva para ingeniarte otra cosa que sirva
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
sin imagen de perfil

RE:Generar archivo de texto

Publicado por Marcelo Madelon (572 intervenciones) el 01/04/2010 20:26:59
Eduardo,
Cuando me referia a que uses Csting era con un archivo Basic delimitado por comas por que ascii no te permitie CSTRING
Hice una prueba. Este es el código que use:

! Grabo el archivo ArchTxt que es un BASIC y en Full Path Name: -->> ArchTxt.TXT
! tiene un solo campo ARC:Campo y es CSTIRNG
! al archivo este lo podes abrir con cualquier editor
! aca listo el archivo de pedido y el detalle correspondiente a cada uno
! Pedid001 tiene los datos de la cabecera
! Pedid002 tiene los datos del detalle
! el rango de fechas lo marca LOC:FechaDesde / LOC:FechaHasta

! Recorro los pedidos desde FechaDesde hasta FechaHasta
Clear (PE1:Record)
PE1:Fecha = LOC:FechaDesde
SET (PE1:KeyFecha,PE1:KeyFecha) ! Me posiciono
LOOP UNTIL Access:Pedid001.Next() or PE1:Fecha > LOC:FechaHasta ! leo hasta que encuentre una fecha superior a Fecha Hasta
! Leo los datos del cliente
CLI:CodCliente = PE1:CodCliente ! Leo los datos del cliente
IF Access:Clientes.Fetch(CLI:KeyCodCliente)
CLI:ApellidoNombre = 'Cliente Inexistente' ! Me manejo asi por que es solo un ejemplo
CLI:Direccion = 'Zona Urbana' !
END
! Armo el campo y grabo datos de la cabecera separado por ','
Clear(ARC:Record)
ARC:Campo = ('NOTA de PEDIDO FECHA: '& ',' & format (PE1:Fecha,@d6)& ',' & Clip(CLI:ApellidoNombre) & CHR(13) & CHR(10))
Access:ArchTxt.Insert()

! Recorro
Clear(PE2:Record)
PE2:VectorPedido = PE1:VectorPedido
SET (PE2:KeyVectorPedido,PE2:KeyVectorPedido) ! me posiciono
LOOP UNTIL Access:Pedid002.Next() or PE2:VectorPedido <> PE1:VectorPedido

ART:CodArticulo = PE2:CodArticulo ! Leo Articulos
IF Access:Articulos.Fetch(ART:KeyCodArticulo)
ART:Denominacion = 'Artículo Inexistente' ! Tener en cuenta que esto es solo un ejemplo. Si en una empresa
END ! Presentas un programa asi vas a durar poco
! Armo el campo y grabo datos del detalle del pedido
Clear(ARC:Record)
ARC:Campo = (Format(PE2:Cantidad,@N9.2) & ',' & ART:Denominacion & ',' & Format(PE2:ImporteUnitario,@N12.2) & ',' & Format(PE2:ImporteTotal,@N12.2) & CHR(13) & CHR(10))
Access:ArchTxt.Insert()
END ! Loop Pedid002
END ! Loop Pedid001






! lo que sigue es lo que levante con un editor de texto (notepad) del archivo txt



"NOTA de PEDIDO FECHA: ,31/03/2010,PEREZ MARIA LUISA
"
" 1.00,dulce de leche , 121.00, 121.00
"

Podes camiar las comas por espacios ; o cualquier otro caracter
Si no te soluciona puede que te sirva para ingeniarte otra cosa que sirva
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
sin imagen de perfil

RE:Generar archivo de texto

Publicado por Marcelo Madelon (572 intervenciones) el 01/04/2010 20:27:07
Eduardo,
Cuando me referia a que uses Csting era con un archivo Basic delimitado por comas por que ascii no te permitie CSTRING
Hice una prueba. Este es el código que use:

! Grabo el archivo ArchTxt que es un BASIC y en Full Path Name: -->> ArchTxt.TXT
! tiene un solo campo ARC:Campo y es CSTIRNG
! al archivo este lo podes abrir con cualquier editor
! aca listo el archivo de pedido y el detalle correspondiente a cada uno
! Pedid001 tiene los datos de la cabecera
! Pedid002 tiene los datos del detalle
! el rango de fechas lo marca LOC:FechaDesde / LOC:FechaHasta

! Recorro los pedidos desde FechaDesde hasta FechaHasta
Clear (PE1:Record)
PE1:Fecha = LOC:FechaDesde
SET (PE1:KeyFecha,PE1:KeyFecha) ! Me posiciono
LOOP UNTIL Access:Pedid001.Next() or PE1:Fecha > LOC:FechaHasta ! leo hasta que encuentre una fecha superior a Fecha Hasta
! Leo los datos del cliente
CLI:CodCliente = PE1:CodCliente ! Leo los datos del cliente
IF Access:Clientes.Fetch(CLI:KeyCodCliente)
CLI:ApellidoNombre = 'Cliente Inexistente' ! Me manejo asi por que es solo un ejemplo
CLI:Direccion = 'Zona Urbana' !
END
! Armo el campo y grabo datos de la cabecera separado por ','
Clear(ARC:Record)
ARC:Campo = ('NOTA de PEDIDO FECHA: '& ',' & format (PE1:Fecha,@d6)& ',' & Clip(CLI:ApellidoNombre) & CHR(13) & CHR(10))
Access:ArchTxt.Insert()

! Recorro
Clear(PE2:Record)
PE2:VectorPedido = PE1:VectorPedido
SET (PE2:KeyVectorPedido,PE2:KeyVectorPedido) ! me posiciono
LOOP UNTIL Access:Pedid002.Next() or PE2:VectorPedido <> PE1:VectorPedido

ART:CodArticulo = PE2:CodArticulo ! Leo Articulos
IF Access:Articulos.Fetch(ART:KeyCodArticulo)
ART:Denominacion = 'Artículo Inexistente' ! Tener en cuenta que esto es solo un ejemplo. Si en una empresa
END ! Presentas un programa asi vas a durar poco
! Armo el campo y grabo datos del detalle del pedido
Clear(ARC:Record)
ARC:Campo = (Format(PE2:Cantidad,@N9.2) & ',' & ART:Denominacion & ',' & Format(PE2:ImporteUnitario,@N12.2) & ',' & Format(PE2:ImporteTotal,@N12.2) & CHR(13) & CHR(10))
Access:ArchTxt.Insert()
END ! Loop Pedid002
END ! Loop Pedid001






! lo que sigue es lo que levante con un editor de texto (notepad) del archivo txt



"NOTA de PEDIDO FECHA: ,31/03/2010,PEREZ MARIA LUISA
"
" 1.00,dulce de leche , 121.00, 121.00
"

Podes camiar las comas por espacios ; o cualquier otro caracter
Si no te soluciona puede que te sirva para ingeniarte otra cosa que sirva
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

RE:Generar archivo de texto

Publicado por Eduardo (9 intervenciones) el 06/04/2010 18:13:14
Marcelo: disculpá la demora.
El tema lo resolví generando un archivo .XLS y luego a éste, lo abro y lo guardo como archivo de texto (delimitado por tabulaciones) (*.txt)
Un abrazo
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