Problema con añadir valor en una Grid

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Holaaa

ES: Me gustaría que me ayudaras a resolver esto, por favor:
EN (Google Translate): I would like you to help me solve this, please:

Imagen

ES: Lo que necesito es que cuando se agregan los mismos productos, que no se agreguen nuevos, sino que la Cantidad aumente.
EN: What I need is that when the same products are added, that no new ones are added, but that the Quantity increases.

ES: Este es el código que tengo para ingresar productos por código de barras:
EN:This is the code I have to enter products by barcode:

b = Input.GetText("barcode");

if b > "1000000" and b <= "9999999" then

for row in db:nrows("SELECT * FROM Products where Code="..b.."") do

if b == (row.Code) then

Input.SetText("barcode", "");
Page.SetFocus("barcode")

nRowID = Grid.InsertRow("GridSales", -1, false);
Grid.SetCellText("GridSales", nRowID, 0, row.Code, false);
Grid.SetCellText("GridSales", nRowID, 1, row.Name, false);
Grid.SetCellText("GridSales", nRowID, 2, row.SalePrice, false);
Grid.SetCellText("GridSales", nRowID, 3, "1", false);
Grid.SetCellText("GridSales", nRowID, 4, "0", false);



--Multiplica le Valor * Cantidad

value = Grid.GetCellText("GridSales", nRowID, 2);
quantity  = Grid.GetCellText("GridSales", nRowID, 3);
multi = value * quantity;
Grid.SetCellText("GridSales", nRowID, 4, multi, true);



--Suma toda la Columna 4

cell_value = 0;
for x = 1, Grid.GetRowCount ("GridSales")-1 do
if Grid.GetCellText ("GridSales", x, 4) ~= "" and String.ToNumber(Grid.GetCellText ("GridSales", x, 4)) ~= 0 then
cell_value = cell_value + String.ToNumber (Grid.GetCellText ("GridSales", x, 4))
end
end
Input.SetText("total", Math.Round(cell_value, false));

--************************************************** ********************************

Grid.Refresh("GridSales");

--************************************************** *******************************

end
end
end

ES: La idea final sería que aumente la cantidad y no un nuevo registro cuando se agregan los mismos productos.
EN: The final idea would be that the quantity increases and not a new record when the same products are added.

Thanks.
Antes de agregar el nuevo producto, lo que debes hacer es buscar en el grid el producto y si ya existe, sumarle 1 y si no existe, agregarlo normalmente
Dow Sher escribió:
12 Mar 2021 04:46
Antes de agregar el nuevo producto, lo que debes hacer es buscar en el grid el producto y si ya existe, sumarle 1 y si no existe, agregarlo normalmente
Claro, pero justamente eso no puedo hacer... estoy intentado tomar el Código del último ingreso, si ese Código ya está en la lista, Sumar +1 a la Cantidad del Código existente y luego borrar el último ingreso. Así lo ve mi mente xD Pero no me resulta.
local barcode = String.ToNumber(Input.GetText('barcode'));
local quantity = String.ToNumber(Input.GetText('quantity'));

if barcode < 1000000 or barcode > 9999999 then
  Dialog.Message('Error', 'Invalid barcode');
  return;
end

addProduct(barcode, quantity);
Grid.Refresh('GridSales');

local totalSale = 0;
for row = 1, Grid.GetRowCount('GridSales') -1 do
  local productTotalSalePrice = String.ToNumber(Grid.GetCellText('GridSales', row, 4));

  if productTotalSalePrice > 0 then
    totalSale = totalSale + productTotalSalePrice;
  end
end

Input.SetText('total', Math.Round(total, false));
Input.SetText('barcode', '');
Input.SetText('quantity', '');
Page.SetFocus('barcode');


function addProduct(barcode, quantity)
  for row = 1, Grid.GetRowCount('GridSales') -1 do
    local productCode = Grid.GetCellText('GridSales', row, 0);

    if (barcode == productCode) then
      local salePrice = String.ToNumber(Grid.GetCellText('GridSales', row, 2));
      local previousQuantity = String.ToNumber(Grid.GetCellText('GridSales', row, 3));
      local nextQuantity = previousQuantity + quantity;

      Grid.SetCellText('GridSales', row, 3, nextQuantity);
      Grid.SetCellText('GridSales', row, 4, nextQuantity * salePrice);

      return
    end
  end

  local products = db:nrows('SELECT * FROM Products where Code='..barcode);

  for product in products do
    if barcode == product.Code then
      local row = Grid.InsertRow('GridSales', -1, false);

      Grid.SetCellText('GridSales', row, 0, product.Code, false);
      Grid.SetCellText('GridSales', row, 1, product.Name, false);
      Grid.SetCellText('GridSales', row, 2, product.SalePrice, false);
      Grid.SetCellText('GridSales', row, 3, quantity, false);
      Grid.SetCellText('GridSales', row, 4, quantity * products.SalePrice, false);

      return
    end
  end
end
Por favor, disculpame pero hace an~os que no toco AMS, pero esta es la lógica que yo usaría.
Dow Sher escribió:
13 Mar 2021 00:01
Por favor, disculpame pero hace an~os que no toco AMS, pero esta es la lógica que yo usaría.
Amigo, no me funcionó... de todas maneras te agradezco la idea. Te dejo un apz con la base de datos y tu código añadido si es que quieres revisar.

HIDE: ON
Hidebb Message Hidden Description


Saludos.
Dow Sher escribió:
13 Mar 2021 00:01

Por favor, disculpame pero hace an~os que no toco AMS, pero esta es la lógica que yo usaría.
Ya pude solucionar el tema, en el foro de Indigo Rose me ayudó un tal colc (Todos los créditos para el).


En Funciones Globales:

function finddup()
str_String2Find = Input.GetText("inp_code");
iColumnCount = Grid.GetColumnCount("GridSales");
iRowCount = Grid.GetRowCount("GridSales");
for iThisRow = 1, iRowCount do

	for iThisColumn = 0, iColumnCount do
	
		str_ThisCellText = Grid.GetCellText("GridSales", iThisRow, 0);

		iFoundAt = String.Find(str_ThisCellText, str_String2Find, 1, false);

			if iFoundAt ~= -1 then

				Grid.SetFocusCell("GridSales", iThisRow, 0);
				Grid.SetSelectedRange("GridSales", iThisRow, iThisColumn, iThisRow, iThisColumn, true, true);

				tblCellFocus = Grid.GetFocusCell("GridSales");
					if tblCellFocus  then
    					nCol = tblCellFocus.Column
    					nRow = tblCellFocus.Row

   					end
				Dupe = true
				
			end	
	end
end

end


En el Input "inp_code":

b = Input.GetText("inp_code");

if b > "1000000" and b <= "9999999" then
	
	for row in db:nrows("SELECT * FROM Products where Code="..b.."") do

		if b == (row.Code) then
			finddup()
			
			if Dupe then

			Quantity  = Quantity  + 1
			Grid.SetCellText("GridSales", nRow, 3, Quantity, true);
			
			Value = String.ToNumber(Grid.GetCellText("GridSales",nRow, 2));
			Quantity  = String.ToNumber(Grid.GetCellText("GridSales", nRow, 3));
			
			Multi = Value * Quantity ;
			Grid.SetCellText("GridSales", nRow, 4, Multi, true);
			
			
			else
			nRowID = Grid.InsertRow("GridSales", -1, false);
			
			Grid.SetCellText("GridSales", nRowID, 0, row.Code, false);
			Grid.SetCellText("GridSales", nRowID, 1, row.Name, false);
			Grid.SetCellText("GridSales", nRowID, 2, row.SalePrice, false);
			Grid.SetCellText("GridSales", nRowID, 3, "1", false);
			Grid.SetCellText("GridSales", nRowID, 4, "0", false);

			Value = Grid.GetCellText("GridSales", nRowID, 2);
			Quantity  = Grid.GetCellText("GridSales", nRowID, 3);
			Multi = Value * Quantity ;
			Grid.SetCellText("GridSales", nRowID, 4, Multi, true);
			end
			
			
				cell_value = 0;
				for x = 1, Grid.GetRowCount("GridSales")-1 do
					if Grid.GetCellText ("GridSales", x, 4) ~= "" and String.ToNumber(Grid.GetCellText ("GridSales", x, 4)) ~= 0 then
					cell_value = cell_value + String.ToNumber (Grid.GetCellText ("GridSales", x, 4))
					end
				end
					
		
		 
	Input.SetText("total", Math.Round(cell_value, false));
	Input.SetText("inp_code", "");
	Page.SetFocus("inp_code")
	Dupe = false
--**********************************************************************************
		
Grid.SetEnabled("GridSales", true);
Grid.Refresh("GridSales");

--*********************************************************************************


end
end
end


Gracias, amigo, se agradece el tiempo que te tomaste en ayudarme. Saludos.

***En el comentario de arriba dejé un apz para el que lo quiera utilizar y modificar los códigos.***
lo ideal es mantener una tabla con los datos a la vez que rellenas el grid y comprobar esa tabla, el programa sera muuucho mas eficiente que buscar cell a cell una y otra vez...
:pc: viendo :pc:
Pabloko escribió:
17 Mar 2021 00:31
lo ideal es mantener una tabla con los datos a la vez que rellenas el grid y comprobar esa tabla, el programa sera muuucho mas eficiente que buscar cell a cell una y otra vez...
Sabes que he ingresado hasta 100 productos y siempre los añade a la misma velocidad. Ya que no tiene muchos objetos en la Sección Venta:

Imagen

Por lo general son imágenes... desde la esquina superior izquierda, hasta el código de barras es solo 1 imagen, donde van 1 botón y 3 input encima. En general utilizo 4 Input y 2 xButton en esa página.

De todos modos, estoy haciendo esta aplicación para un negocio pequeño, donde no se añadirán mas de 5 productos distintos por venta. Solo me falta probar la impresora de tickets para que imprima como debe ser (58mm). Estuve revisando tu Aplicación uTPV, para ver como lo hacías tú, pero utilizas un tal "RCPrinter" que no supe configurar. Diste los pasos en el Post, pero no pude hacerlo. :p

Saludos.
Eso de rcprinter era un ejecutable en c# .net
creo que para funcionar se debe crear una impresora con el driver generico TEXT-ONLY y configurar el nombre por alguna parte, ya no recuerdo pero ese software creo que aun funciona por ahi...

si me pasas el ejecutable le echo 1 ojo
Pabloko escribió:
18 Mar 2021 05:01
Eso de rcprinter era un ejecutable en c# .net
creo que para funcionar se debe crear una impresora con el driver generico TEXT-ONLY y configurar el nombre por alguna parte, ya no recuerdo pero ese software creo que aun funciona por ahi...

si me pasas el ejecutable le echo 1 ojo
Solo debes de llamar a tu impresora de Tiket TPV para que se imprima el tiket aunque dejaste una variable para colocar el nombre de la impresora se puede dejar el nombre de la impresora también dentro de la variable o que lea un archivo de texto donde coloques el nombre de la impresora para que sea mas personaliza ble.
Pabloko escribió:
18 Mar 2021 05:01
Eso de rcprinter era un ejecutable en c# .net
creo que para funcionar se debe crear una impresora con el driver generico TEXT-ONLY y configurar el nombre por alguna parte, ya no recuerdo pero ese software creo que aun funciona por ahi...

si me pasas el ejecutable le echo 1 ojo
Se comparto tu aplicación, ese ejecutable está en la carpeta Docs.

HIDE: ON
Hidebb Message Hidden Description
ya me acuerdo, usa c# eso, con dnspy puedes ver el src, basicamente uso 2 archivos txt, uno con el texto a imprimir y otro con el nombre de la impresora (nombre que se le da en las propiedades de impresoras)

Imagen
Imagen

una vez se escriben los 2 txt, se ejecuta el exe y ya hace su funcion solo y se cierra...

este programa lo hice en 1 hora una mañana que se rompio el software de una empresa y no podian arreglarlo, asi que tuve que hacer esto para que pudieran cobrar unos dias a los clientes. Normalmente habria hecho una dll para que la imprementacion fuera mas simple...
Pabloko escribió:
18 Mar 2021 08:02
ya me acuerdo, usa c# eso, con dnspy puedes ver el src, basicamente uso 2 archivos txt, uno con el texto a imprimir y otro con el nombre de la impresora (nombre que se le da en las propiedades de impresoras)
Descargaré el dnspy y veré que puedo hacer. Gracias, Pabloko.
Pabloko escribió:
18 Mar 2021 08:02
ya me acuerdo, usa c# eso, con dnspy puedes ver el src, basicamente uso 2 archivos txt, uno con el texto a imprimir y otro con el nombre de la impresora (nombre que se le da en las propiedades de impresoras)
Viendo bien la imagen que dejaste pude hacer que funcionara xD No era complicado, pero no le había dado el suficiente tiempo. Gracias! :penguin:
re abro este tema, pregunta para Pablo me he fijado que RCPrinter.exe parte la impresión en 3 partes como que cada txt lo toma como 3 paginas diferentes y el problema que causa esto es que si configurar la impresora térmica para que imprima el logo en el encabezado lo imprime 3 veces uno por cada pagina.

Ejemplo.


LOGO
tiketcabecera.txt
LOGO
CONTENIDO
LOGO
tiketpie.txt

dejo una imagen para que vena a lo que me refiero.
Imagen

la configuracion de las impresoras es de que impriman el logo en el encabezado de cada pagina por ello lo imprime 3 veces, como se puede resolver ese problema.