JSON

318 views
Skip to first unread message

Juan Miguel Solis

unread,
Jun 25, 2026, 8:05:02 AMJun 25
to Comunidad de Visual Foxpro en Español
Buenos dias

Estoy intentando usar el PRG JSON para poder genera un fichero JSON,, lo que hao es lo siguiente:

En el INIT del formulario

DO JSON   && y Luego saco un mensajito para tener constancia de que se ha cargado.

Luego en un momento dado, caundo tengo todos los datos , llamo al metodo método   CreaJson y ahi, hago lo siguiente :

-----------------------------------------------------------------------------------------------------

LOCAL dFFact, cfechaFact, nDetalleId, cDetalle, nDetalle
dFFact = DTOS( Thisform.Caja_CbFecFct.value )
cfechaFact =LEFT(dFFact,4) + '-' +SUBSTR(dFFact,5,2)+'-'+right(dFFact,2)
nDetalleId = 0

factura = CREATE("DynObj")
factura.UserId = "PEYIE2"
factura.CompanyFiscalId = "B82998097"
factura.Invoices = CREATE("Collection")
invoice = CREATE("DynObj")
invoice.Establecimiento = "00"
invoice.Serie = "F"
invoice.Numero = cSeekFct
invoice.FechaExpedicion = cfechaFact
invoice.FechaOperacion = null
invoice.Descripcion = "DESCRIPCION FACTURA"
invoice.ImporteTotal = nCuotaIva + nSubTotal
invoice.ImporteRetencioSoportada = 0.00
invoice.EsSimplificada = false
invoice.EsSustitutivaSimplificada = false
invoice.TipoFactura = "F1"
invoice.TipoEmisor = 1
invoice.Moneda = "EUR"
invoice.TipoCambio = 1.00
invoice.Idioma = "ES"
invoice.FormaDePago = "Transferencia"
invoice.contraparte = CREATE("DynObj")
invoice.contraparte.Denominacion = Thisform.Caja_CbNombre.value
invoice.contraparte.TipoFiscal = cTipoFiscal  &&  0 = España, Si es terceros paises '06' o '02' intracomunitario (ver con Agustin)
invoice.contraparte.IdFiscal = Thisform.Caja_CbNifCif.value
invoice.contraparte.address = CREATE("DynObj")
invoice.contraparte.address.Direccion = ALLTRIM(Thisform.Caja_CbDomi1.value)
invoice.contraparte.address.Poblacion = ALLTRIM(Thisform.Caja_CbPobla.value)
invoice.contraparte.address.CodigoPostal = Thisform.Caja_CbCpost.value
invoice.contraparte.address.Province = IIF( EMPTY(Thisform.Caja_CbProvi.value), ALLTRIM(Thisform.Caja_CbPobla.value),Thisform.Caja_CbProvi.value )
  invoice.contraparte.address.CodigoPais = nIntraC  && Crear campo en PAIS.DBF para poner 1 si es comunitario y sino dejarlo a 0
  invoice.contraparte.Contactos = CREATE("Collection")
  contacto1 = CREATE("DynObj")
  contacto1.Id = 0
  contacto1.CounterPartId = 0
  contacto1.Nombre = "Juan Miguel"
  contacto1.Apellido = "Solis Sandes"
 invoice.contraparte.contactos.add(contacto1)
 
  invoice.DetalleRectificacion = CREATE("DynObj")
  invoice.DetalleRectificacion.CodigoFacturaRectificativa = null
  invoice.DetalleRectificacion.TipoFacturaRectificativa = null
  invoice.DetalleRectificacion.DetalleFacturas = CREATE("Collection")
 
 
  invoice.Payments = CREATE("Collection")
  pago1 = CREATE("DynObj")
pago1.Id = 0
pago1.Type = 2
pago1.Medio = 9
pago1.descriptions = ALLTRIM(CB_FACTU.CB_FOPAG)
pago1.Fecha = "2026-12-31"
pago1.Importe = nCuotaIva + nSubTotal
invoice.payments.add(pago1)


&&&   Crear lineas de Dealle
invoice.DetalleFactura = CREATE("Collection")

select TMPFACTU
set filter to !empty( FC_SEL )
go top

Do While !eof('TMPFACTU')
nDetalle = nDetalleId + 1
cDetalle = 'detalle' + STRTRAN( STR( nDetalle,4 ), ' ', '' )
&cDetalle. = CREATE("DynObj")

&cDetalle..Id = nDetalleId  
&cDetalle..TipoDesgloseOperacion = nTipDglOpe && 0 = Españolas, 1 = bienes, 2 = Servicios  (Todo los demas incluyendo si es de Ceuta, Melilla, Las Canarias)
&cDetalle..InversionSujetoPasivo = false
&cDetalle..descripcion = ALLTRIM(TMPFACTU.fc_des)
&cDetalle..Unidades = 1.00
&cDetalle..ImporteUnitario = TMPFACTU.fc_impor
&cDetalle..CosteUnitario = TMPFACTU.fc_impor  
&cDetalle..Descuento = 0
&cDetalle..TipoIva = TMPFACTU.fc_ivat
&cDetalle..alle1.TipoRe = 0  && Ver si tiene clientes con RE.
&cDetalle..CauseExencion = null  
&cDetalle..CausaNoSujeta = null  
&cDetalle..SubTotalLinea =  && Poner Subtotal de linea SIN IVA
&cDetalle..Position = TMPFACTU.fc_lin  
&cDetalle..Clave = "01"  && Esto de la clave es siempre fijo ?
** &cDetalle..UserdeDineData = CREATE("DynObj")  &&& De momento nada.
&cDetalle..InvoiceId = 0  
invoice.DetalleFactura.add(&cDetalle.)

SKIP IN 'TMPFACTU'
nDetalleId = nDetalleId +1
Enddo
&& para añadir 2 detalle y siguientes


factura.invoices.add(invoice)

-----------------------------------------------------------------------

Pero me da este error :

"No se encuentra la definición de clase DYNOBJ."

Aquí ya no se porque me dice esto, además como podría ver lo que se me ha grabado o poder generar un fichero con todo lo que va dentro ?

Alguien tiene algún ejemplo de esto.

Un saludo



Juan Gonzalez

unread,
Jun 25, 2026, 10:18:03 AMJun 25
to publice...@googlegroups.com
LOCAL dFFact, cfechaFact, nDetalleId, factura, invoice, loDetalle, loPago, lcJson

* 1. Preparación de fechas

dFFact = DTOS( Thisform.Caja_CbFecFct.value )
cfechaFact = LEFT(dFFact,4) + '-' + SUBSTR(dFFact,5,2) + '-' + RIGHT(dFFact,2)
nDetalleId = 0

* 2. Creación del objeto raíz

factura = CREATE("DynObj")
factura.UserId = "PEYIE2"
factura.CompanyFiscalId = "B82998097"
factura.Invoices = CREATE("Collection")

* 3. Creación de la factura

invoice = CREATE("DynObj")
invoice.Establecimiento = "00"
invoice.Serie = "F"
invoice.Numero = cSeekFct
invoice.FechaExpedicion = cfechaFact
invoice.FechaOperacion = null
invoice.Descripcion = "DESCRIPCION FACTURA"
invoice.ImporteTotal = nCuotaIva + nSubTotal
invoice.ImporteRetencioSoportada = 0.00
invoice.EsSimplificada = .F.
invoice.EsSustitutivaSimplificada = .F.

invoice.TipoFactura = "F1"
invoice.TipoEmisor = 1
invoice.Moneda = "EUR"
invoice.TipoCambio = 1.00
invoice.Idioma = "ES"
invoice.FormaDePago = "Transferencia"

* 4. Contraparte

invoice.contraparte = CREATE("DynObj")
invoice.contraparte.Denominacion = Thisform.Caja_CbNombre.value
invoice.contraparte.TipoFiscal = cTipoFiscal
invoice.contraparte.IdFiscal = Thisform.Caja_CbNifCif.value
invoice.contraparte.address = CREATE("DynObj")
invoice.contraparte.address.Direccion = ALLTRIM(Thisform.Caja_CbDomi1.value)
invoice.contraparte.address.Poblacion = ALLTRIM(Thisform.Caja_CbPobla.value)
invoice.contraparte.address.CodigoPostal = Thisform.Caja_CbCpost.value
invoice.contraparte.address.Province = IIF( EMPTY(Thisform.Caja_CbProvi.value), ALLTRIM(Thisform.Caja_CbPobla.value), Thisform.Caja_CbProvi.value )
invoice.contraparte.address.CodigoPais = nIntraC

* 5. Pagos

invoice.Payments = CREATE("Collection")
loPago = CREATE("DynObj")
loPago.Id = 0
loPago.Type = 2
loPago.Medio = 9
loPago.descriptions = ALLTRIM(CB_FACTU.CB_FOPAG)
loPago.Fecha = "2026-12-31"
loPago.Importe = nCuotaIva + nSubTotal
invoice.payments.add(loPago)

* 6. Líneas de Detalle (Bucle optimizado sin macros)

invoice.DetalleFactura = CREATE("Collection")

SELECT TMPFACTU
SET FILTER TO !EMPTY( FC_SEL )
GO TOP

SCAN
    loDetalle = CREATE("DynObj")
    loDetalle.Id = nDetalleId
    loDetalle.TipoDesgloseOperacion = nTipDglOpe
    loDetalle.InversionSujetoPasivo = .F.
    loDetalle.descripcion = ALLTRIM(TMPFACTU.fc_des)
    loDetalle.Unidades = 1.00
    loDetalle.ImporteUnitario = TMPFACTU.fc_impor
    loDetalle.CosteUnitario = TMPFACTU.fc_impor
    loDetalle.Descuento = 0
    loDetalle.TipoIva = TMPFACTU.fc_ivat
    loDetalle.TipoRe = 0
    loDetalle.CauseExencion = null
    loDetalle.CausaNoSujeta = null
    loDetalle.SubTotalLinea = (TMPFACTU.fc_impor * 1) && Asegúrate de calcularlo aquí
    loDetalle.Position = TMPFACTU.fc_lin
    loDetalle.Clave = "01"
    loDetalle.InvoiceId = 0
   
    invoice.DetalleFactura.add(loDetalle)
    nDetalleId = nDetalleId + 1
ENDSCAN

* 7. Finalizar y generar JSON
factura.invoices.add(invoice)

* Convertir a JSON y guardar
lcJson = factura.ToString()
STRTOFILE(lcJson, "factura_" + ALLTRIM(cSeekFct) + ".json")

MESSAGEBOX("Fichero JSON generado correctamente.")

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/41682759-2744-4e92-b168-ed2a9f63e030n%40googlegroups.com.

Victor Espina

unread,
Jun 29, 2026, 4:12:37 PMJun 29
to Comunidad de Visual Foxpro en Español
Te falta la definicion de la clase DynObj (https://github.com/vespina/dynobj).

Juan Miguel Solis

unread,
Jun 30, 2026, 4:34:20 AMJun 30
to publice...@googlegroups.com
Buenos días

Gracias por la ayuda de nuevo, o sea que solo me falta crear el DYNOBJ.PRG y añadirlo a mi proyecto ?

Un saludo

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/publicesvfoxpro/up6IA5pIIQg/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/6c4cca4e-f6f4-4a1d-a038-a04ba43fe4f1n%40googlegroups.com.

Juan Miguel Solis

unread,
Jun 30, 2026, 4:46:47 AMJun 30
to publice...@googlegroups.com
Buenos dias

Y ante todo perdona por mi torpeza en este tema.

Lo añadí al proyecto pero me sigue pasando lo mismo (el mismo error), tengo que ejecutar primero antes de DO JSON el Do DYNOBJ ?

Un saludo

El lun, 29 jun 2026 a las 22:12, Victor Espina (<vesp...@gmail.com>) escribió:

Victor Espina

unread,
Jun 30, 2026, 11:39:35 AMJun 30
to Comunidad de Visual Foxpro en Español
No basta con agregar el DYNOBJ.PRG al proyecto, tienes que cargarlo en memoria poniendo esto al inicio de tu programa principal:

SET PROCEDURE TO dynobbj ADDITIVE


El tema es que VFP no sabe donde encontrar la clase dynobj a menos que la misma este cargada en memoria. Eso es lo que hace SET PROCEDURE.  Otra forma es con NEWOBJECT, dado que esa funcion te permite indicar donde esta ubicada la clase, ej:

oFactura = NEWOBJECT("dynobj", "dynobj.prg")

Saludos


Victor Espina

Juan Miguel Solis

unread,
Jul 1, 2026, 1:27:51 PMJul 1
to publice...@googlegroups.com
Buenos dias/tardes Victor

Bueno ahora con lo que me dijiste (activar con el SET PROCEDURE....ADDITIVE, ya no me da ningún error e incluso me dice que fichero JSON Generado con el mensaje final :) :)  , pero cuando intento convertir el objeto es un fichero con extensión JSON de esta manera :

  * Convertir a JSON y guardar
lcJson = factura.ToString()
STRTOFILE(lcJson, "C:\AEAT\factura.json")  && Marca el path a incluir en el fchero JSON  

porque no me genera el fichero o si me lo genera no hay información, algo mas debo estar haciendo mal.

Que mas cosas puedo estar haciendo mal ?

Un saludo
------------------------------------------------------------------
Este es el código completo ya modificado ..............
-------------------------------------------
LOCAL dFFact, cfechaFact, nDetalleId, factura, invoice, loDetalle, loPago, lcJson

* Preparación de fechas


dFFact = DTOS( Thisform.Caja_CbFecFct.value )
cfechaFact =LEFT(dFFact,4) + '-' +SUBSTR(dFFact,5,2)+'-'+right(dFFact,2)
nDetalleId = 0

* Creación del objeto raíz


factura = CREATE("DynObj")
factura.UserId = "PEYIE2"
factura.CompanyFiscalId = "B82998097"
factura.Invoices = CREATE("Collection")

* Creación de la factura


invoice = CREATE("DynObj")
invoice.Establecimiento = "00"
invoice.Serie = "F"
invoice.Numero = cSeekFct
invoice.FechaExpedicion = cfechaFact
invoice.FechaOperacion = null
invoice.Descripcion = "DESCRIPCION FACTURA"
invoice.ImporteTotal = nCuotaIva + nSubTotal
invoice.ImporteRetencioSoportada = 0.00
invoice.EsSimplificada = .F.
invoice.EsSustitutivaSimplificada = .F.

invoice.TipoFactura = "F1"
invoice.TipoEmisor = 1
invoice.Moneda = "EUR"
invoice.TipoCambio = 1.00
invoice.Idioma = "ES"
invoice.FormaDePago = "Transferencia"

* Contraparte


invoice.contraparte = CREATE("DynObj")
invoice.contraparte.Denominacion = Thisform.Caja_CbNombre.value
invoice.contraparte.TipoFiscal = cTipoFiscal  &&  0 = España, Si es terceros paises '06' o '02' intracomunitario (ver con Agustin)
invoice.contraparte.IdFiscal = Thisform.Caja_CbNifCif.value
invoice.contraparte.address = CREATE("DynObj")
invoice.contraparte.address.Direccion = ALLTRIM(Thisform.Caja_CbDomi1.value)
invoice.contraparte.address.Poblacion = ALLTRIM(Thisform.Caja_CbPobla.value)
invoice.contraparte.address.CodigoPostal = Thisform.Caja_CbCpost.value
invoice.contraparte.address.Province = IIF( EMPTY(Thisform.Caja_CbProvi.value), ALLTRIM(Thisform.Caja_CbPobla.value),Thisform.Caja_CbProvi.value )
invoice.contraparte.address.CodigoPais = nIntraC  && Crear campo en PAIS.DBF para poner 1 si es comunitario y sino dejarlo a 0

invoice.contraparte.Contactos = CREATE("Collection")
contacto1 = CREATE("DynObj")
contacto1.Id = 0
contacto1.CounterPartId = 0
contacto1.Nombre = "Juan Miguel"
contacto1.Apellido = "Solis Sandes"
invoice.contraparte.contactos.add(contacto1)
 
invoice.DetalleRectificacion = CREATE("DynObj")
invoice.DetalleRectificacion.CodigoFacturaRectificativa = null
invoice.DetalleRectificacion.TipoFacturaRectificativa = null
invoice.DetalleRectificacion.DetalleFacturas = CREATE("Collection")
 
* Pagos

 
invoice.Payments = CREATE("Collection")
loPago = CREATE("DynObj")
loPago.Id = 0
loPago.Type = 2
loPago.Medio = 9
loPago.descriptions = ALLTRIM(FACT_CAB.CB_FOPAG)

loPago.Fecha = "2026-12-31"
loPago.Importe = nCuotaIva + nSubTotal
invoice.payments.add(loPago)


* Crear lineas de Detalle


invoice.DetalleFactura = CREATE("Collection")

select TMPFACTU
set filter to !empty( FC_SEL )
go top

SCAN
    loDetalle = CREATE("DynObj")
    loDetalle.Id = nDetalleId
    loDetalle.TipoDesgloseOperacion = nTipDglOpe
    loDetalle.InversionSujetoPasivo = .F.
    loDetalle.descripcion = ALLTRIM(TMPFACTU.FC_DES)
    loDetalle.Unidades = 1.00
    loDetalle.ImporteUnitario = TMPFACTU.FC_IMP
loDetalle.CosteUnitario = TMPFACTU.FC_IMP
loDetalle.Descuento = 0
loDetalle.TipoIva = TMPFACTU.FC_IVAT

loDetalle.TipoRe = 0
loDetalle.CauseExencion = null
loDetalle.CausaNoSujeta = null
loDetalle.SubTotalLinea = (TMPFACTU.FC_IMP * 1) && Asegúrate de calcularlo aquí
loDetalle.Position = TMPFACTU.FC_LIN

loDetalle.Clave = "01"
loDetalle.InvoiceId = 0
   
invoice.DetalleFactura.add(loDetalle)
    nDetalleId = nDetalleId + 1
ENDSCAN

* Finalizar y generar JSON

factura.invoices.add(invoice)

* Convertir a JSON y guardar
lcJson = factura.ToString()
STRTOFILE(lcJson, "C:\AEAT\factura.json")  && Marca el path a incluir en el fchero JSON

*STRTOFILE(lcJson, "C:\AEAT\factura_" + ALLTRIM(cSeekFct) + ".json")  && Marca el path a incluir en el fchero JSON



MESSAGEBOX("Fichero JSON generado correctamente.")

Juan Gonzalez

unread,
Jul 1, 2026, 2:59:27 PMJul 1
to publice...@googlegroups.com
tendrias que tener un modelo....   aunquesea en otro lenguaje es mas facil de convertir


Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/CA%2BBv44W%3DJUeP81fjxDsMk8%2B2wfXa7tv99Um0fdyhKVGdeYAFEQ%40mail.gmail.com.

Juan Miguel Solis

unread,
Jul 1, 2026, 3:09:04 PMJul 1
to publice...@googlegroups.com
Hola

No tengo ningún modelo, pensaba que así podría sacar los datos y pasarlos a un JSON

Gracias de todas maneras, seguiré viendo cómo hacerlo 

Un saludo 

Juan Gonzalez

unread,
Jul 1, 2026, 4:03:13 PMJul 1
to publice...@googlegroups.com
hagamos algo....  si tenes que datos son hagamos el json...      y luego te replico la funcion para crearlo....   o si tenes algun modelo de un json mejor

Victor Espina

unread,
Jul 3, 2026, 9:03:00 AM (14 days ago) Jul 3
to Comunidad de Visual Foxpro en Español
El metodo toString depende de que tengas un parser JSON cargado; de lo contrario devolvera un string vacio.  Pon esto antes del STRTOFILE:

MESSAGEBOX(TYPE("JSON.Name"))

Si la respuesta es "U" entronces no tienes el parser JSON cargado..  En ese caso, debes descargarlo desde https://github.com/vespina/json y luego poner esto al inicio de tu programa:

DO JSON

Otra razon para este comportamiento es que si tengas el parser JSON pero el mismo este generando un error.  Esto puede pasar si alguna propiedad conteine un valor que genere algun problema en el parser.  Para esto, puedes hacer lo siguiente:

LOCAL lcJSON
lcJSON = factura.toString()
IF JSON.lastError.hasError
    MESSAGEBOX("Error en JSON: " + JSON.lastError.Message)
    RETURN
ENDIF

En el interin, yo voy a modificar la clase DynObj para hacer eso mismo dentro del metodo ToString, de modo que si el stringify da un error, el mismo se reporte hacia arriba.  Parra cuando leas esto ya el cambio estara listo en https://github.com/vespina/dynobj.


Saludos

Victor Espina

Juan Gonzalez

unread,
Jul 3, 2026, 10:57:52 AM (14 days ago) Jul 3
to publice...@googlegroups.com
dejame hacerte unos ejemplos y te los envio


Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/14803615-0890-4493-9293-e6c5fd032b48n%40googlegroups.com.

Juan Miguel Solis

unread,
Jul 3, 2026, 11:01:12 AM (14 days ago) Jul 3
to publice...@googlegroups.com
Buenos dias /tardes

Después de tus últimos consejos (que de verdad te agradezco muchísimo), ahora ya descargue tanto el JSON.PRG como el DYNOBJ.PRG y lo actualize, ahora esta asi:

En el proyecto, y los tengo puestos.
image.png

Esto MESSAGEBOX(TYPE("JSON.Name")) , ahora me devuelve "C" y me genera la FACTURA.JSON (te la envio adjunta), pero como podrás ver lo que hay dentro no tiene nada que ver con lo que debería ser, como podrás ver.

La verdad ahora estoy mas perdido que un burro en un garaje, si se te ocurre como pudeo ver lo que pasa te lo agradeceria infinitamente. :)

Un saludo




factura.json

Juan Gonzalez

unread,
Jul 3, 2026, 11:32:23 AM (14 days ago) Jul 3
to publice...@googlegroups.com
prueba este: 


LOCAL loJson, loFactura, lcJsonFinal

* 1. Creamos la estructura raíz
loJson = CREATEOBJECT("Empty")
ADDPROPERTY(loJson, "companyfiscalid", "B82998097")
ADDPROPERTY(loJson, "userid", "PEYIE2")

* 2. Creamos la estructura de la factura (invoices)
loFactura = CREATEOBJECT("Empty")
ADDPROPERTY(loFactura, "baseclass", "Custom")
ADDPROPERTY(loFactura, "class", "Dynobj")
ADDPROPERTY(loFactura, "classlibrary", "dynobj.fxp")
ADDPROPERTY(loFactura, "comment", "")
ADDPROPERTY(loFactura, "controlcount", 0)
ADDPROPERTY(loFactura, "controls", "<<CONTROLS no es un objeto.>>")
ADDPROPERTY(loFactura, "height", 17)
ADDPROPERTY(loFactura, "helpcontextid", 0)
ADDPROPERTY(loFactura, "left", 0)
ADDPROPERTY(loFactura, "name", "Dynobj")
ADDPROPERTY(loFactura, "objects", "<<OBJECTS no es un objeto.>>")
ADDPROPERTY(loFactura, "parent", "<<PARENT no es un objeto.>>")
ADDPROPERTY(loFactura, "parentclass", "Custom")
ADDPROPERTY(loFactura, "picture", "")
ADDPROPERTY(loFactura, "tag", "")
ADDPROPERTY(loFactura, "top", 0)
ADDPROPERTY(loFactura, "whatsthishelpid", -1)
ADDPROPERTY(loFactura, "width", 100)

* 3. Creamos una colección para el array 'invoices'
LOCAL loColeccionInvoices
loColeccionInvoices = CREATEOBJECT("Collection")
loColeccionInvoices.Add(loFactura) && Aquí agregamos el objeto factura al array

* Usamos ADDPROPERTY para asignar la colección entera a la propiedad 'invoices'
ADDPROPERTY(loJson, "invoices", loColeccionInvoices)

* 4. Convertimos a JSON y guardamos
lcJsonFinal = nfJsonCreate(loJson)
STRTOFILE(lcJsonFinal, "factura.json")
MESSAGEBOX("Archivo generado exactamente.", 64, "Creador")

solo sustituyes los datos

Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/CA%2BBv44X0HJ99kq3WXfNXJW6MYoC3xQXNiSGSDYWgire0quyYpg%40mail.gmail.com.

Juan Gonzalez

unread,
Jul 3, 2026, 12:16:05 PM (14 days ago) Jul 3
to publice...@googlegroups.com
me avisas si funciono

Juan Miguel Solis

unread,
Jul 3, 2026, 3:25:27 PM (13 days ago) Jul 3
to publice...@googlegroups.com
Buenas Juan 

Perdona , pero debe ser que mi  nivel no da para tanto, cusnfo dices Orduña este , te refieres a que haga un método y como lo que me pones ?

Y en el caso de que sea así, luego me dices que solo sustituya los datos y aquí ya me pedí porque esto que me envías no se parece en nada a lo que tengo y no comprendo bien lo que hay que hacer, perdona por no entender esto de verdad.

Lo Miraré con cuidado a ver si me entero.

Un saludo 

así

Victor Espina

unread,
Jul 3, 2026, 6:32:34 PM (13 days ago) Jul 3
to Comunidad de Visual Foxpro en Español
Ok, el tema era que DynObj no fue pensado para un escenario tan complejo como este.  Ya hice un refactoring del metodo GetObject() que era el que estaba causando el problema.  Solo actualiza el codigo de DYNOBJ.PRG desde el repositorio y ya deberia funbcionarte.

Victor Espina



Juan Gonzalez

unread,
Jul 3, 2026, 6:43:50 PM (13 days ago) Jul 3
to publice...@googlegroups.com
el prg genera excactamente lo del json....   pero

por ejemplo

ADDPROPERTY(loJson, "companyfiscalid", "B82998097")

sustituye  B82998097 por tu variable....

ADDPROPERTY(loJson, "userid", "PEYIE2")

sustituye PEYIE2 por tu variable... y asi lo haces con todo....   asi cambias con los datos que necesitas

Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/bcd649a5-c421-4224-a19b-2b53dd568241n%40googlegroups.com.

Juan Miguel Solis

unread,
Jul 6, 2026, 5:26:07 AM (11 days ago) Jul 6
to publice...@googlegroups.com
Hola Victor

Con el último cambio que realizaste en el DYNOBJ.PRG ahora los datos se ven asi, te envio el fichero generado, l oque veo es que el orden no esta coo en el ordenen el que se grabaron .los datos, voy a ver si puede valer asi,

image.png
Porque los datos se graban de la siguiente manera:
factura.json

Juan Miguel Solis

unread,
Jul 6, 2026, 5:36:14 AM (11 days ago) Jul 6
to publice...@googlegroups.com
Buenos dias Juan

Te refieres a que en vez de usar el el dynobj,prg y Json.prg use esto ?  y por cada campo que tenga que poner, le añade una propiedad que se llame con el campo que quiero rellenar


ADDPROPERTY(loJson, "companyfiscalid", "B82998097")
sustituye  B82998097 por tu variable....

ADDPROPERTY(loJson, "userid", "PEYIE2")
sustituye PEYIE2 por tu variable... y asi lo haces con todo....   asi cambias con los datos que necesitas

Un saludo

Juan Miguel Solis

unread,
Jul 6, 2026, 5:48:29 AM (11 days ago) Jul 6
to publice...@googlegroups.com
Hola Victor para que mas o menso veas la diferencia, te envio el factura.jon que genera la aplicacion, a como ve la factura (que en teoria seria la buena ), en factura_OK.json, aparecen en lineas distintas cada entrada, eso me imagino que sera igual si teodo va seguido peor por ejemplo el companyFiscaly y l UserIde, ses lo primero.

Un saludo
factura.json
factura_OK.json

Victor Espina

unread,
Jul 6, 2026, 10:02:46 AM (11 days ago) Jul 6
to Comunidad de Visual Foxpro en Español
En un JSON el orden de las propiedades no es relevante.  Tampoco el hecho de que este minimizado (sin saltos de llinea).  Lo que importa es la estructura de mismo.

Saludos

Victor Espina

Juan Gonzalez

unread,
Jul 6, 2026, 10:14:01 AM (11 days ago) Jul 6
to publice...@googlegroups.com
entonces esta bien asi?...  o hay que hacerle alguna modificacion?

Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/abd3f996-58a7-40b2-8bba-513fc5909ac9n%40googlegroups.com.

Victor Espina

unread,
Jul 6, 2026, 10:14:03 AM (11 days ago) Jul 6
to Comunidad de Visual Foxpro en Español
Como te decia antes, en un JSON el orden de las propiedades no es relevante.  Lo que si es relevante es el nombre de las propiedades, pues las mismas son case sensitive (en la mayorria de los casos).   Lamentablemente ni DynObj ni el mi parser JSON tienen la capacidad de respetar el casing original de las propiedades y, dado que por lo que veo estas haciendo esto para algun tipo de interfaz de facturacion electronica, es muy probable que el JSON que estas generando no sea aceptado por el tema de los nombres de las propiedades.

Para ese escenario (Facturacion Electronica),  lamentablemente necesitas generar el string JSON manualmente con TEXT - ENDTEXT,  para que puedas controlar correctamente e casing de las propiedades.

Saludos

Victor Espina

Juan Miguel Solis

unread,
Jul 6, 2026, 11:58:26 AM (11 days ago) Jul 6
to publice...@googlegroups.com
Si es para el tema de verifactu en España, le mandé a la persona que lo chequea y de momento solo me ha comentado algunas cosas pero nada del tema del orden, o sea que seguro que será como tú dices que el tema es poner bien el nombre de las propiedades que son case  sensitive , eso si lo sé .

Bueno seguiré por este camino a ver donde me lleva, ya ir iré informando, me imagino que aparte de tex-endtext también partía crearme el fichero creándolo a bajo nivel con puts….

Un saludo

Victor Espina

unread,
Jul 6, 2026, 5:31:44 PM (10 days ago) Jul 6
to Comunidad de Visual Foxpro en Español
No, la idea general seria esta:

LOCAL cJSON
cJSON = ""
TEXT TO cJSON NOSHOW TEXTMERGE
{
   "UserId": "PEYIE2",
   "CompanyFiscalId": "B82998097",
   "Invoices": [
      {
         "Establecimiento":  "00",
         "Serie": "false",
         "Numero": "<<cSeekFct>>",
         "FechaExpedicion": "<<cfechaFact>>",
         "FechaOperacion": null,
         "Descripcion": "DESCRIPCION FACTURA",
         "ImporteTotal": <<nCuotaIva + nSubTotal>>,
         "ImporteRetencioSoportada": 0.00,
         "EsSimplificada": "false",
         "EsSustitutivaSimplificada": "false"
          ...
      } 
  ]
}
ENDTEXT

STRTOFILE(cJSON, "factura.json")


Saludos

Victor Espina

Juan Miguel Solis

unread,
Jul 6, 2026, 5:53:01 PM (10 days ago) Jul 6
to publice...@googlegroups.com
Ok, bueno si al final JSON y DYNOBJ mecdicen algo lo intentaré de esta otra manera que dices.

Muchas gracias y un saludo 

Reply all
Reply to author
Forward
0 new messages