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.
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.