Spanish como vaciar el index de una consulta en archivos de texto en un formulario en JSON

juangtju

Member
buenos dias , tardes y noches amigos del foro, tengo un pequeño detalle que no eh logrado solucionar.

B4X:
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("1")
    B4XPages.SetTitle(Me, "Distribuidora de Viveres Ishosu C.A.")
    xui.SetDataFolder("TableAndForms")
    editCol = B4XTable1.AddColumn("Editar", B4XTable1.COLUMN_TYPE_TEXT)
    editCol.Sortable = False
    editCol.Width = 127dip
    B4XTable1.RowHeight = 50dip
    B4XTable1.TextColor = xui.Color_Blue
    B4XTable1.NumberOfFrozenColumns = 1
    B4XTable1.AddColumn("Codigo", B4XTable1.COLUMN_TYPE_TEXT).Width = 90dip
    B4XTable1.AddColumn("Nombre", B4XTable1.COLUMN_TYPE_TEXT).Width = 300dip
    B4XTable1.AddColumn("TipoDocu", B4XTable1.COLUMN_TYPE_TEXT).Width = 50dip
    B4XTable1.AddColumn("Ruta", B4XTable1.COLUMN_TYPE_TEXT).Width = 50dip
    B4XTable1.AddColumn("NumeDocu", B4XTable1.COLUMN_TYPE_TEXT).Width = 127dip
    B4XTable1.AddColumn("FECHA", B4XTable1.COLUMN_TYPE_DATE).Width = 90dip
    B4XTable1.AddColumn("Monto", B4XTable1.COLUMN_TYPE_NUMBERS).Width = 90dip
    B4XTable1.AddColumn("usado", B4XTable1.COLUMN_TYPE_TEXT)
    LoadData
    PrefDialog.Initialize(Root, "Editable Table", 300dip, 300dip)
    
    PrefDialog.LoadFromJson(File.ReadString(File.DirAssets, "template.json"))
    PrefDialog.SetOptions("codiclie", File.ReadList(File.DirAssets, "codigos.txt"))
    PrefDialog.SetOptions("nbclie", File.ReadList(File.DirAssets, "animals.txt"))
    Log(PrefDialog.SetOptions("nbclie", File.ReadList(File.DirAssets, "animals.txt")))
    PrefDialog.SetOptions("numedocu", File.ReadList(File.DirApp, "prueba.txt"))
    PrefDialog.SetOptions("ruta", File.ReadList(File.DirAssets, "rutas.txt"))
    PrefDialog.SearchTemplate.MaxNumberOfItemsToShow = 1

    B4XTable1.MaximumRowsPerPage = 25
    B4XTable1.BuildLayoutsCache(B4XTable1.MaximumRowsPerPage)
    For i = 1 To editCol.CellsLayouts.Size - 1
        Dim p As B4XView = editCol.CellsLayouts.Get(i)
        p.AddView(CreateButton("btnEdit", Chr(0xF044)), 2dip, 5dip, 40dip, 40dip)
        p.AddView(CreateButton("btnDelete", Chr(0xF00D)), 44dip, 5dip, 40dip, 40dip)
        p.AddView(CreateButton("btnDuplicate",Chr(0xF0C5)), 85dip, 5dip, 40dip, 40dip)
        
    Next
    
End Sub

en este programa tengo un b4xtable para presentar, agregar , editar y borrar registros que se guardan internamente en un archivo csv, sin embargo logre hacer una consulta directa a una base de datos y guardar los string que necesito en un archivo de texto, mi problema es que cuando abro el formulario basado en un template, hecho en PrefDialog, si abro por ejemplo codigo de cliente , me idexa lo que tengo guardado en el doc de texto para los codigos de cliente , si luego busco numero de documento , este me indexa todos los resultados de ese archivo tambien, el problema es que si regreso a codigo de cliente , me sigue apareciendo el index de este caso el de numero de documento y me borra el otro, y esto es hasta que quitas la aplicacion, lo que necesito es saber como refrescar los index de cada busqueda o como haria para evitar este detalle . espero alguien me pueda ayudar
 

Attachments

  • 1636395786486.png
    1636395786486.png
    169.3 KB · Views: 37

roerGarcia

Active Member
Licensed User
Asumo que esta parte es la responsable de lo mostrado en el dialogo
Codigo:
    PrefDialog.LoadFromJson(File.ReadString(File.DirAssets, "template.json"))
    PrefDialog.SetOptions("codiclie", File.ReadList(File.DirAssets, "codigos.txt"))
    PrefDialog.SetOptions("nbclie", File.ReadList(File.DirAssets, "animals.txt"))
    Log(PrefDialog.SetOptions("nbclie", File.ReadList(File.DirAssets, "animals.txt")))
    PrefDialog.SetOptions("numedocu", File.ReadList(File.DirApp, "prueba.txt"))
    PrefDialog.SetOptions("ruta", File.ReadList(File.DirAssets, "rutas.txt"))
Necesitas cambiar el orden del codigo, recrear la data o verificar si en el dialogo hay un "inicializar".
 

José J. Aguilar

Expert
Licensed User
Hola:

No sé si entiendo muy bien lo que indicas. Supongo que estás usando el ejemplo Editable Table + Form, e imagino que te refieres a que cuando pulsas el botón "Edit" te salen datos que no corresponden a la fila que has pulsado.
A un PrefDialog, se le pasa un mapa como argumento. Si el mapa está vació, el formulario estará en blanco y cuando pulsas aceptar, los datos se cargaran en ese mapa.
Si el mapa contiene ya datos, estos se mostrarán en el formulario y se actualizarán cuando pulses aceptar.
Comprueba qué mapa le estás pasando como argumento:

B4X:
Sub btnEdit_Click
    Dim RowId As Long = GetRowId(Sender) 'Obtiene el id e la fila en la que has hecho click sobre el botón edit
    Dim Item As Map = B4XTable1.GetRow(RowId) 'Obtiene el mapa con los datos almacenados en esa línea
    ShowDialog(Item, RowId) 'Muestra el PrefDialog pasando como argumento el mapa anterior.
End Sub
 

juangtju

Member
si , eso lo entiendo, a lo que yo me refiero con la pregunta es sobre el indice o index que se genera con los datos que estan en los archivos de texto para cada opcion del prefdialog, resulta que cuando le doy añadir y pues editar (esa parte de que aparece vacia lo se pero gracias por el codigo ) si por ejemplo me voy a codiclie me sale una lista con los codigos de cliente que estan en el archivo de texto correspondiente, a esto , el sistema genera un index con esa informacion, ok, luego si me voy en el mismo formulario a nbclie hace lo mismo antes mencionado, el sistema carga la data del archivo de texto en un index y lo pasa a las opciones , ahora es que viene el detalle ya que si regreso a codiclie, ya este no me vuelve a cargar el archivo de texto de el, y en cambio me muestra las opciones del ultimo cargado que en este caso es nbclie por ejemplo, ese es mi detalle , quiero sabes si existe un codigo o un metodo para vaciar o que se pueda recargar el index las veces que presione la opcion correcta en el formulario ya que si no tendre que cambiar toda la funcion completa
 

José J. Aguilar

Expert
Licensed User
Debes tener algún error por ahí. Mira, he modificado el ejemplo original (sólo he probado en B4J), para que haya dos campos options, y al seleccionar uno u otro, cambian los valores.

tabla.gif
 

Attachments

  • B4XTableEdit.zip
    194.7 KB · Views: 24

juangtju

Member
si tienes razon

alli esta el projecto , el referido en cuestion es el de b4j, tiene una conexion a una base de datos que se actualiza mediante un boton pero, no es necesaria para que se pueda ver lo que yo comento, ya que el proceso que hice para probar , fue hacer una consulta a la bd y luego pasarla a un archivo de texto para que la lea las opciones del formulario en este caso numedocu en cuestion, el hecho es que si las lee , pero, al parecer cuando en un formulario hay varios campos con opciones y que le asignes opciones con texto o con una consulta directa al db, el sistema carga un index de esa data PERO siempre te mantiene el ultimo index sin importar luego el campo en el formulario donde te dirijas, es decir que a pesar de tener informacion en distintos archivos de texto si yo busco nombre de cliente y me sale la opcion , yo establezco un nombre de cliente , luego me voy a numero de documento y me sale tambien, pongo mi numero de documento, pero, si regreso a el nombre de cliente, el sistema no me genera un nuevo index de ese campo sino que me establece el ultimo cargado es decir en este caso el de numero de documento entonces cuando quiero cambiar el nombre de cliente solo me sale numeros de factura
 

juangtju

Member
Debes tener algún error por ahí. Mira, he modificado el ejemplo original (sólo he probado en B4J), para que haya dos campos options, y al seleccionar uno u otro, cambian los valores.

View attachment 121719
si, eh revisado el ejemplo y si los guarda pero ten en cuenta que al yo poner las opciones , dejo solo a vista PrefDialog.SearchTemplate.MaxNumberOfItemsToShow = 1, un solo registro, entonces si te das cuenta , cuando lo dejas a un registro el index se pasa a esa vista y se queda alli es decir que si yo tengo uno solo el index es de uno solo, porque no lo pongo que se vean todos , pues porque la tabla de facturas me tiene 49850 registros , ya lo probe y me causa mucha lentitud y gasto excesivo de recursos , pero el detalle es ese , si a este mismo ejemplo establecele a 1 los item mostrados y luego abre la opcion type que son los animales , ahora abre el color y elije el primero no importa , si te vas de nuevo a type, a los animales te daras cuenta que solo sale canidae cierto pero escribe dog por ejemplo,(que sabes que esta en la lista) pero no te va a dar ninguna coincidencia ya que queda es siempre el ultimo index en el registro en este caso los colores y entonces si alli tu pones naranja, en el de opcion type (animales ), te daras cuenta que te va a buscar esa coincidencia , es porque el sistema siempre guarda el ultimo index, y al generarlo solo lo pasa a la vista de registros de opciones como tal, a menos que asi deba funcionar , y de ser que asi, entonces tendre que ubicar otro metodo, ya sea con un cuadro de texto que al poner el numero de factura me salgan coincidencias .
 

José J. Aguilar

Expert
Licensed User
Echando un vistazo a la SQLSearchView que es en lo que está basada SearchTemplate, parece que efectivamente se genera un índice. No sé si se podría poner el ejemplo que pones a ver qué indica Erel.
De todas formas, y sin saber muchos datos, creo que puede haber algún error de concepto en cómo estás enfocando esto. No sé si es muy práctico descargar 50000 registros para hacer búsquedas en varios campos.
No sé, si nos pudieras explicar qué es lo que quieres hacer, quizás se nos ocurra otra idea. Tu aplicación será para PC o para Android?
 

juangtju

Member
solo para pc , debe ser un sistema de vueltos en facturas , basicamente este es la problematica, las facturas cuando son pagadas aveces el cliente paga un poco mas , maximo pueden ser 9 dolares tal ves llegue a 10 caso extremo, es por esto que ese sobrante se debe llevar un registro de este mismo por factura para luego cuando el cliente vuelva a hacer un pago descontarle ese vuelto que quedo de la otra factura , ya eso es un proceso interno, sin embargo el sistema solo debe guardar registros los cuales solo podran ser modificados por administrador, y consumidos , a traves de una casilla que seria (disponible, usado) y su respectiva fecha al ser usado, y pues lo unico que el usuario debe buscar es el numero de factura como tal y a traves de este criterio que llame toda la info pertinente, que seria codigo de cliente, nombre de cliente , numero de ruta de vendedor , fecha de la facturacion(todo esto ya lo tiene la tabla de factura) y pues fecha de creacion de este registro y el valor de cosumo si es dispobilbe o usado, luego deben haber otro tipo de usuario el cual sera solo visor el que no podra modificar registros pero si podra buscar por codigo de cliente y les aparecera dicha busqueda ,esto no es dificil , creo que lo que no conozco de hacer es basado en un criterio que me traiga toda la otra informacion en un mapa para yo presentarlo en una vista, creo que es mejor en una b4xtable pienso yo,
 

juangtju

Member
Echando un vistazo a la SQLSearchView que es en lo que está basada SearchTemplate, parece que efectivamente se genera un índice. No sé si se podría poner el ejemplo que pones a ver qué indica Erel.
De todas formas, y sin saber muchos datos, creo que puede haber algún error de concepto en cómo estás enfocando esto. No sé si es muy práctico descargar 50000 registros para hacer búsquedas en varios campos.
No sé, si nos pudieras explicar qué es lo que quieres hacer, quizás se nos ocurra otra idea. Tu aplicación será para PC o para Android?
si , tambien pienso que es un error de enfoque como tal, en si, necesito es una manera asi sea b4xpages a traves de un cuadro de texto donde me llame esos resultados y me las ubique en otros cuadros de texto
 

José J. Aguilar

Expert
Licensed User
Echa un vistazo a Lazy Loading, se van cargando resultados conforme vas bajando. El empleado no sabe de antemano el número de documento o factura?

Un ejemplo de lazy loading mientras vas introduciendo texto:

 

juangtju

Member
Echa un vistazo a Lazy Loading, se van cargando resultados conforme vas bajando. El empleado no sabe de antemano el número de documento o factura?

Un ejemplo de lazy loading mientras vas introduciendo texto:

si porsupuesto, cada ingreso de registro es unicamente con la factura en mano , esto garantiza que siempre debe estar en el registro como tal, voy a darle un vistazo a ver si encuentro mi enfoque
 

José J. Aguilar

Expert
Licensed User
Entonces sólo tendrías que tener un campo de búsqueda en el que introducir el número de factura, y haces una consulta a mysql para que te traiga los datos de esa factura, no?
 

juangtju

Member
Entonces sólo tendrías que tener un campo de búsqueda en el que introducir el número de factura, y haces una consulta a mysql para que te traiga los datos de esa factura, no?
si exacto , y pues tal ves mostrar toda la informacion puede ser en b4xtable tal ves por la cantidad de registros que puede llegar a tener como tal, a menos que utilize tu ejemplo de las cartas pero en ves de ser tan cuadradas las hago mas finas para que los registros se vean en una vista parecida , lo importante es ver como puedo hacer para introducir el numero de factura y me traiga esa informacion en un mapa que creo que seria la mejor alternativa
 

roerGarcia

Active Member
Licensed User
¿No estas complicando un poco una simple consulta valor-buscado -> información-a-mostrar?

Si partes de un numero de factura para localizar la información necesaria para la tarea que esta efectuando el usuario seria mas fácil y directo, #1 solicitar la factura, #2 localizar la info en la base de datos, #3 desplegar y #4 procesar según lo indique el usuario en la aplicación.

Tienes la factura en la mano, la información en la base de datos y ya conoces el algoritmo de aplicación de vueltos.

Simplifica.

Saludos
 

juangtju

Member
¿No estas complicando un poco una simple consulta valor-buscado -> información-a-mostrar?

Si partes de un numero de factura para localizar la información necesaria para la tarea que esta efectuando el usuario seria mas fácil y directo, #1 solicitar la factura, #2 localizar la info en la base de datos, #3 desplegar y #4 procesar según lo indique el usuario en la aplicación.

Tienes la factura en la mano, la información en la base de datos y ya conoces el algoritmo de aplicación de vueltos.

Simplifica.

Saludos
tienes razon amigo , conozco todo esa informacion, y si, simples consultas las conozco perfectamente , pero buscar un criterio y trasformarlo en un mapa , me cuesta todavia , soy nuevo en este framework en realidad, sin embargo reconozco que en comparacion aca es bastante sencillo realizar las cosas.
 

roerGarcia

Active Member
Licensed User
Estaba tratando de recordar un dicho de un ex-jefe, "Las cosas primero las hacemos bien, luego las hacemos bonitas". O algo asi. Te sugiero que simplifiques y luego con gusto le echamos un ojo a tu proyecto fallido, (para adquirir el conocimiento) mas tarde que caiga yo por la oficina.
Saludos.
 

juangtju

Member
Estaba tratando de recordar un dicho de un ex-jefe, "Las cosas primero las hacemos bien, luego las hacemos bonitas". O algo asi. Te sugiero que simplifiques y luego con gusto le echamos un ojo a tu proyecto fallido, (para adquirir el conocimiento) mas tarde que caiga yo por la oficina.
Saludos.
si esta bien , les agradezco muchisimo su ayuda y sus consejos , acabo de realizar la consulta y verifique como llamar varias variables , solo debo pasarlo a un mapa, o creo que tengo otra manera tambien, porque uno de los principales desafios , es las conexiones a la base de datos , ya que dicha tabla de factura pertenece a un sistema mayor administrativo que actualmente posee 72 pcs conectadas y con conexion directa a la base de datos , es por esto que pense en ahorrar recursos de la bd parseando dicha consulta a un documento de texto , o en este caso con un ejemplo de erel [B4X] SQLSearchView - SQLite based Search View se puede convertir la data en un sqlite para que trabaje interno y entonces el index aca trabaja con mas cantidad de resultados que es lo importante, esto ya que esta pensado para que lo trabajen unas 35 usuarios aprox y no quiero saturar el sistema , trabajare solo con b4xtables , creo que es la mejor manera de establecer la informacion mas VISIBLE , luego es posible que lo cambie y lo ponga como lo tiene en el ejemplo de las cartas por meses de jose aguilar , me parece una buena opcion, y gracias a su ejemplo tambien tengo la informacion de poner login en mi app,

 

José J. Aguilar

Expert
Licensed User
Hola:

Te adjunto el ejemplo modificado para buscar en la base de datos.
Tendrás que añadir en el archivo config.properties de B4J la línea
B4X:
sql.getFactura = SELECT * FROM B4X.events WHERE `id` = ?

app.gif


Como te comenté en este hilo sólo es cuestión de enviar el número de factura como consulta a la base de datos.
No te preocupes por el rendimiento, 35 (y mucho más) ordenadores son muy poca carga para una base de datos, aparte de que esto serán algunas consultas que tardarán milisegundos en ejecutarse.
 

Attachments

  • Factura.zip
    210.1 KB · Views: 16
Top