Texto delimitado en un informe de Access

Desarrollé una aplicación en access "Punto de venta e Inventarios" solo estoy atorado en dos cosas, sé que no se puede por medio de access delimitar un informe, en las tabla y consultas solamente se puede, pero en un informe solo con código VB. ¿Podrías ayudarme? Me han dicho que en una tabla de selección, pero no se puede puesto que la información en el informe no es vertival, sino horizontal. Te ponmgo un ejemplo:
H1 MARTIN AGUILAR MARISCAL 44 9873772 12 40.00 CALLE 4
H2 CALAVERA NISSAN SENTRA 160.00 168.00 NEGRA
Así es como esta en el informe y necesito pasarlo al block de notas delimitado tal como lo pongo de ejemplo aquí abajo:
H1|MARTIN AGUILAR MARISCAL|44|9873772|12|40.00|CALLE 4|
H2|CALAVERA NISSAN SENTRA|160.00|168.00|NEGRA|
Me pasaron un código pero este me delimita toda la tabla, habrá la manera un código que exporte al block de notas ya delimitado, ¿tal cómo está en el informe idéntico pero en forma delimitado?
Ojala y me pudieras ayudar con esto llevo meses y no he podido solucionar.

1 respuesta

Respuesta
1
No entiendo cual es el verdadero problema, ¿deseas la información en un inforne de access o solo exportarla al bloc de notas?
por lo que veo deseas generar una especie de archivo ascii paara registro electronico o similar;
Si solo deseas exportar al bloc de notas o a un archivo ascii mi sugerencia es leer cada campo de la bd que deseas exportar e ir concatenando, al final lo vas agregando al archivo ascii, en internet hay bastante información sobre el uso de archivos con vb.
Si no respondí adecuadamente por favor detállame que deseas con "delimitar un informe"
Suerte.
Hola Experto Muchas gracias por copntestar, mira, access ne genera un informe de una consulta con información con filtro e información pegada (Dbúsq) y alineada en forma horizontal y claro simplemente la exporto a text al block de notas. No hay problema. Quisiera ver si existe un programa que delimite texto ya sea desde Block de notas o Word. (No Excel) En excel solo hay delimitadores por tab y comas necesito por PIPES ( | ).
Ya me han enviado códigos en VB pero no funciona, delimita toda la tabla de origen, otros hacer una nueva query por SQL tampoco, solo necesito tal como muestra el informe la información o en la exportación a text a delimitado-. ¿Me podrías ayudar?, por cualquier cosa te mando el código que me habían dado.
*Nota en el primer código q me enviaron demiliotaba toda la tabla y lo modificaron y ahora en esta linea me marca subrayado con amarillo.
Set qd = CurrentDb().CreateQueryDef("tmpQueryInforme", txtSQL)
La verdad te soy sincero, ya no quise molestar al experto, me dio pena pues no me gusta abusar, pero pues sigo estancado jajaja.
Option Compare Database
Option Explicit
Sub exportarInforme(ByRef miReport As Report)
    Dim resp As Integer
    Dim qd As QueryDef
    ' Preguntamos si se quiere exportar los datos del informe
resp = MsgBox("¿Desea exportar los datos del informe?", vbQuestion + vbYesNo)
    If resp = vbNo Then Exit Sub    ' No quiere. ADIOS
    ' Si viene por aquí es que SI quiere exportarlos. Definimos las variables
    Dim rs As Recordset ' Para ir leyendo los registros del informe
    Dim nf As Integer   ' Número del archivo en el que vamos a escribir
    Dim nombreSalida As String  ' Nombre del fichero de salida que vamos a crear
    Dim linea As String ' Línea que vamos a escribir
    Dim i As Integer    ' Para contar los campos del registro
    Dim txtSQL As String    ' Para copiar el origen de registros del informe
    ' Generamos el nombre que va a tener el fichero de salida
nombreSalida = CurrentDb().Name
    Do While Right$(nombreSalida, 1) <> "\"
        nombreSalida = Left$(nombreSalida, Len(nombreSalida) - 1)
    Loop
    ' Ahora nombreSalida contiene el nombre de la carpeta en la que está
' nuestra base de datos.
    ' Añadimos el nombre de salida
    nombreSalida = nombreSalida & "facturaelectronica.txt"
    ' Abrimos el fichero para escribir en él
    Close ' Por si hubiera algún fichero abierto
nf = FreeFile
    Open nombreSalida For Output As nf
    ' Para leer los datos de los registros que se están presentando en el formulario
    ' Crearemos una consulta con la misma selección que el informe
    On Error Resume Next
    DoCmd.RunSQL "drop table tmpQueryInforme"
    DoCmd.RunSQL "drop table tmpTablaInforme"
    On Error GoTo 0
    ' Creamos una consulta con la selección que utiliza el report
    txtSQL = miReport.RecordSource
    If InStr(UCase$(txtSQL), "SELECT ") = 0 Then txtSQL = "select * from [" & txtSQL & "]"
    Set qd = CurrentDb().CreateQueryDef("tmpQueryInforme", txtSQL)
    qd.Close
    ' Si el informe está filtrado, creamos una tabla con el filtro. Si no... usamos
' la misma consulta
    If miReport.Filter <> "" And miReport.FilterOn Then
        txtSQL = "select * " & _
                 "into tmpTablaInforme " & _
                 "from tmpQueryInforme " & _
                 "where " & miReport.Filter
        DoCmd.RunSQL txtSQL
        txtSQL = "tmpTablaInforme"
      Else
        txtSQL = "tmpQueryInforme"
    End If
    ' Abrimos la consulta o tabla (según si teníamos filtro)
    Set rs = CurrentDb().OpenRecordset(txtSQL, dbOpenDynaset)
    ' Escribiremos una línea con los nombres de los campos (quitar si se quiere)
    linea = ""
    For i = 0 To rs.Fields.Count - 1
        If linea <> "" Then linea = linea & "|"
        linea = linea & rs.Fields(i).Name
    Next i
    Print #nf, linea
    ' Ahora recorreremos todo el recordset escribiendo sus datos
    If Not rs.EOF Then rs.MoveLast: rs.MoveFirst
    SysCmd acSysCmdInitMeter, "Exportando datos del informe", rs.RecordCount
    Do While Not rs.EOF
        SysCmd acSysCmdUpdateMeter, rs.AbsolutePosition + 1
        DoEvents
        linea = ""
        For i = 0 To rs.Fields.Count - 1
            If linea <> "" Then linea = linea & "|"
            Select Case rs.Fields(i).Type
                Case dbDate: linea = linea & fechaATexto(rs.Fields(i).value)
                Case dbBoolean: linea = linea & booleanATexto(rs.Fields(i).value)
                Case dbInteger, dbLong, dbDouble, dbSingle, dbDecimal, _
                     dbNumeric: linea = linea & numeroATexto(rs.Fields(i).value)
                Case Else: linea = linea & Nz(rs.Fields(i).value)
            End Select
        Next i
        Print #nf, linea
        rs.MoveNext
    Loop
    rs.Close
    Close nf
    SysCmd acSysCmdClearStatus
    On Error Resume Next
    DoCmd.RunSQL "drop table tmpQueryInforme"
    DoCmd.RunSQL "drop table tmpTablaInforme"
    On Error GoTo 0
    MsgBox "Fichero de salida creado"
End Sub
Function numeroATexto(ByVal valNum As Variant) As String
    numeroATexto = ""
    If IsNull(valNum) Then Exit Function        ' No viene dato
    If Not IsNumeric(valNum) Then Exit Function ' Error: no es un número
    ' Str$ utiliza el punto como separador decimal
    ' Si se quiere usar la coma de separación de decimal usar la
' función format$ en lugar de Str$
    numeroATexto = Trim$(Str$(valNum))
End Function
Function fechaATexto(ByVal valFec As Variant) As String
    fechaATexto = ""
    If IsNull(valFec) Then Exit Function        ' No viene dato
    If Not IsDate(valFec) Then Exit Function ' Error: no es un número
    fechaATexto = Format$(valFec, "yyyymmdd")   ' O el formato que pidan
End Function
Function booleanATexto(ByVal valBol As Integer) As String
    ' Devuelve S si es verdadero o N si es falso (poner los valores que se quiera)
    If valBol Then booleanATexto = "S" Else booleanATexto = "N"
End Function
Gracias.
Martin342
Ok, mira veo en el código que te pasaron que es VB interno de access, sin embargo este cuenta con varias limitantes respecto al Lenguaje en si, pero la idea básica es correcta ya que lo ideal es generar una nueva consulta sql que arroje los datos idénticos al reporte(por cada sección encabezado, detalle y pie), de modo que dispongas de la información de cada campo del reporte en alguna variable. Una vez tenido esto solo es cuestión de recorrer el recorset (o esas variables) y concatenar con PIPES para luego grabarlas en el fichero o bloc de notas.
El código anterior es bastante largo pero incluye (a su manera la idea básica), te sugiero realizar tu propio código partiendo de obtener por pasos la información necesaria para procesarla, unirla con PIPES (delimitarla como lo comentas), y posteriormente grabarla en el fichero.
Lamentablemente no podría darte un ejemplo en código porque la verdad hace mucho que no uso access para programar en él ya que la sintaxis varia ligeramente.
Esta área del código es la importante, puede que este mismo código no te sirva pero es lo fundamental solo adáptalo:
' Ahora recorreremos todo el recordset escribiendo sus datos 
    If Not rs.EOF Then rs.MoveLast: rs.MoveFirst 
    SysCmd acSysCmdInitMeter, "Exportando datos del informe", rs.RecordCount 
    Do While Not rs.EOF 
        SysCmd acSysCmdUpdateMeter, rs.AbsolutePosition + 1 
        DoEvents 
        linea = "" 
        For i = 0 To rs.Fields.Count - 1 
            If linea <> "" Then linea = linea & "|" 
            Select Case rs.Fields(i).Type 
                Case dbDate: linea = linea & fechaATexto(rs.Fields(i).value) 
                Case dbBoolean: linea = linea & booleanATexto(rs.Fields(i).value) 
                Case dbInteger, dbLong, dbDouble, dbSingle, dbDecimal, _ 
                     dbNumeric: linea = linea & numeroATexto(rs.Fields(i).value) 
                Case Else: linea = linea & Nz(rs.Fields(i).value) 
            End Select 
        Next i 
        Print #nf, linea 
        rs.MoveNext 
    Loop 
    Rs. Close
    Close nf
    SysCmd acSysCmdClearStatus
Suerte con tu proyecto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas