Proceso de conciliación / comparar datos dos Grid

HMG en Español

Moderator: Rathinagiri

jparada
Posts: 433
Joined: Fri Jan 23, 2009 5:18 pm

Proceso de conciliación / comparar datos dos Grid

Post by jparada »

Buen día,
Un poco de historia... Pensando en automatizar o semi-automatizar el proceso de conciliación, tal vez no como tal tomando en cuenta saldos iniciales, sino sólo poniendo énfasis en que los movimientos que reporta el estado de cuenta del banco coincida con los movimientos auxiliares del sistema de contabilidad... sean identificados.

Tratando de implementar ésta solución, el primer reto al menos para mi fue obtener la información del archivo pdf que envía el banco, consultamos con el banco y no ofrece o es lo que nos informaron un archivo en ningún otro formato sólo pdf...

Después de varios intentos con varias herramientas pude resolver ese tema, después el reto fue de alguna manera homologar los datos, porque hay una línea principal con la descripción del movimiento y debajo otras líneas del detalle de movimiento y ese detalle no tiene un patrón, pueden ser una línea de detalle o hasta n, tal vez aquí me falto conocimiento técnico para resolver con harbour ese problema, así que utilicé otra herramienta para resolver ese reto, de manera que ya tengo una información homologada con una sola línea en donde tengo la descripción del movimiento + la descripción del detalle (n cantidad de líneas en una sola espacio como separador)...

Así que ya con esa información leo los archivos el de banco y el auxiliar contable y obtengo dos array que pongo en dos controles Grid, algo así:
img1.png
img1.png (49.46 KiB) Viewed 1747 times

y bien a partir de aquí la idea es de alguna manera buscar las coincidencias de los importes entre las columnas de ambos Grid, debe coincidir importe/fecha la descripción puede variar mucho así que puede ser una búsqueda parcial entre las columnas de "descripcion" y bueno agregar otra columna para indicar si hay alguna coincidencia localizada.

Y bueno un poco largo el post porque quería ser un poco claro en lo que estoy buscando y que aún no tengo idea cómo comenzar que es cómo hacer esa búsqueda, cómo comparar los valores entre un Grid y el otro.

Alguno de ustedes ha resuelto algo similar, alguna idea que pueda compartir?.

Gracias por su tiempo.

Saludos,
Javier
User avatar
Claudio Ricardo
Posts: 367
Joined: Tue Oct 27, 2020 3:38 am
DBs Used: DBF, MySQL, MariaDB
Location: Bs. As. - Argentina

Re: Proceso de conciliación / comparar datos dos Grid

Post by Claudio Ricardo »

Hola...
Puedes, en un bucle For o While comparar ambos arrays con la función Ascan () y con If o Case tomar las decisiones.
Corrige al sabio y lo harás más sabio, Corrige al necio y lo harás tu enemigo.
WhatsApp / Telegram: +54 911-63016162
jparada
Posts: 433
Joined: Fri Jan 23, 2009 5:18 pm

Re: Proceso de conciliación / comparar datos dos Grid

Post by jparada »

Leyendo algunos post encontré algo parecido y es algo como lo que menciona Claudio.

Para pruebas algo así:

Code: Select all

FUNCTION busca(aData)
  LOCAL i
  LOCAL cStr  

  // aData contenido segundo Grid - Datos movimientos auxiliar
  FOR i := 1 TO win1.Grid1.ItemCount  // contenido primer Grid - Datos Banco
    cStr := ALLTRIM(win1.Grid1.Cell(i,2))      
    IF Ascan( aData, { | nRow | nRow[2] == cStr } ) > 0
      MsgExclamation("Dato encontrado")
    ENDIF    
  NEXT 
  
  MsgExclamation("Terminado...")
  
RETURN
Pero eso no me funcionaría para la búsqueda de la descripción del movimiento ya que no es exacta debería de poder utilizar el símbolo $ pero con Ascan no es posible, no sé si cambiando a For each...

Alguna idea?.

Saludos,
Javier
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Proceso de conciliación / comparar datos dos Grid

Post by SALINETAS24 »

jparada wrote: Tue Feb 16, 2021 11:13 pm Leyendo algunos post encontré algo parecido y es algo como lo que menciona Claudio.

Para pruebas algo así:

Code: Select all

FUNCTION busca(aData)
  LOCAL i
  LOCAL cStr  
   .../....
RETURN
Pero eso no me funcionaría para la búsqueda de la descripción del movimiento ya que no es exacta debería de poder utilizar el símbolo $ pero con Ascan no es posible, no sé si cambiando a For each...

Alguna idea?.

Saludos,
Javier
Hola Javier, es raro que una entidad no te facilite los movimientos financieros ni en EXCEL, ni en formato ASCII, yo creo que hay una obligación, por lo menos aquí en España, si lo pides te lo facilitan en una norma estandard, NORMA 43 del CSB, y creo recordar que a nivel europeo también hay algun formato.
Pero vamos a lo tuyo, una posible solución pasa por comparar palabra por palabra, a final te informo de las coincidencias para que ya decidas si consolidar o no...

Code: Select all

// Tendrás que buscar por palabras
FUNCTION busca(aData)
  LOCAL i
  LOCAL cStr  
  LOCAL cTrozo  // cTrozo, subcadena a comparar
  LOCAL nPos    // nPos, donde esta el espacio en blanco
  LOCAL nCont   // Contador de coincidencias
  
   // aData contenido segundo Grid - Datos movimientos auxiliar
  FOR i := 1 TO win1.Grid1.ItemCount  // contenido primer Grid - Datos Banco
    nCont:=0                   // Pongo el contador a cero
	DO WHILE !empty(aData)     // mientras tenga algo que comparar....., comparo
		nPos:=AT(" ",aData)
		IF nPos=0              // Si no encuentro es el ultimo trozo
			cTrozo:=aData
		    aData:=""
		ELSE
			cTrozo:=SUBSTR(aData,1,nPos)    // Si encuentro, troceo
			aData:=SUBSTR(nPos+1)
		ENDIF
	    cStr := ALLTRIM(win1.Grid1.Cell(i,2))      
		IF Ascan( cTrozo, { | nRow | nRow[2] == cStr } ) > 0
			nCont++
        ENDIF   
	ENDDO	
	IF nCont > 0
		MsgExclamation("Encontrado "+STR(nCont)+" Veces")
	ENDIF
  NEXT 
  
  MsgExclamation("Terminado...")
  
RETURN

Espero que te sirva.., y vamos con una cervecita fresquita y confinada...!!
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
AUGE_OHR
Posts: 2093
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: Proceso de conciliación / comparar datos dos Grid

Post by AUGE_OHR »

hi,

normal a Bill or Invoice have different Value
so i would compare DATE + CARGO and DATE + ABONO.
have fun
Jimmy
User avatar
serge_girard
Posts: 3309
Joined: Sun Nov 25, 2012 2:44 pm
DBs Used: 1 MySQL - MariaDB
2 DBF
Location: Belgium
Contact:

Re: Proceso de conciliación / comparar datos dos Grid

Post by serge_girard »

I did something similar in PL/i, years ago, for auto-matching invoices against purchase orders. This was done in batch and only the ones which couldn't match were to handle on screen.

S
There's nothing you can do that can't be done...
jparada
Posts: 433
Joined: Fri Jan 23, 2009 5:18 pm

Re: Proceso de conciliación / comparar datos dos Grid

Post by jparada »

SALINETAS24 wrote: Wed Feb 17, 2021 7:05 am Hola Javier, es raro que una entidad no te facilite los movimientos financieros ni en EXCEL, ni en formato ASCII, yo creo que hay una obligación, por lo menos aquí en España, si lo pides te lo facilitan en una norma estandard, NORMA 43 del CSB, y creo recordar que a nivel europeo también hay algun formato.
Pero vamos a lo tuyo, una posible solución pasa por comparar palabra por palabra, a final te informo de las coincidencias para que ya decidas si consolidar o no...
Hola,
Honestamente no sé si esté legislado éste tema acá en mi país México, pero es lo que me reportan las personas que se contactaron con la institución bancaria.

Te agradezco el código que me muestras pero me está dando error en la línea nPos:=AT(" ",aData) error de argumento

y la línea aData:=SUBSTR(nPos+1) me da error, pero es porque no estamos indicando la variable que en este caso debe ser cTrozo, correcto?.

Lo que vi es que para AT los parámetros son correctos, no sé por qué está dando el error.

Alguna ayuda extra por favor...

Saludos,
Javier
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Proceso de conciliación / comparar datos dos Grid

Post by SALINETAS24 »

jparada wrote: Wed Feb 17, 2021 4:34 pm
SALINETAS24 wrote: Wed Feb 17, 2021 7:05 am Hola Javier, es raro que una entidad no te facilite los movimientos financieros ni en EXCEL, ni en formato ASCII, yo creo que hay una obligación, por lo menos aquí en España, si lo pides te lo facilitan en una norma estandard, NORMA 43 del CSB, y creo recordar que a nivel europeo también hay algun formato.
Pero vamos a lo tuyo, una posible solución pasa por comparar palabra por palabra, a final te informo de las coincidencias para que ya decidas si consolidar o no...
Hola,
Honestamente no sé si esté legislado éste tema acá en mi país México, pero es lo que me reportan las personas que se contactaron con la institución bancaria.

Te agradezco el código que me muestras pero me está dando error en la línea nPos:=AT(" ",aData) error de argumento

y la línea aData:=SUBSTR(nPos+1) me da error, pero es porque no estamos indicando la variable que en este caso debe ser cTrozo, correcto?.

Lo que vi es que para AT los parámetros son correctos, no sé por qué está dando el error.

Alguna ayuda extra por favor...

Saludos,
Javier
Hola Javier,
¿Que contiene aData..? yo he tomado la idea de que aData es una variable que contiene solo la descripción

Si es un array con varias posiciones, tienes que modificar por aData[n], siendo n la posición de la descripción.

Un saludo,
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
Claudio Ricardo
Posts: 367
Joined: Tue Oct 27, 2020 3:38 am
DBs Used: DBF, MySQL, MariaDB
Location: Bs. As. - Argentina

Re: Proceso de conciliación / comparar datos dos Grid

Post by Claudio Ricardo »

Hola...
Algo asi te podria servir:

Code: Select all

// Busca equivalencias de array1 dentro del array2
Function Busca (aArray1,aArray2)

LOCAL i, j, dDate, nCargo, nAbono, cDesc

	If Len (aArray1) > 0 .AND. Len (aArray2) > 0
	
		For i = 1 To Len (aArray1)
		
			dDate := aArray1 [i,1]
			cDesc := aArray1 [i,2]
			nCargo := aArray1 [i,3]
			nAbono := aArray1 [i,4]
			
			For j = 1 To Len (aArray2)
			
				If aArray2 [j,1] == dDate .AND. aArray2 [j,3] == nCargo .AND. aArray2 [j,4] == nAbono
				
					If aArray2 [j,2] $ cDesc
					
						// Msg o acción
						
					EndIf
					
				EndIf
				
			Next

		Next
		
	EndIf
	
Return Nil
Comienza en la primer "linea" del array 1 y busca coincidencias dentro del array 2, si no encuentra continúa con la siguiente.

Para aumentar la coincidencia podrias reemplazar: cDesc := aArray1 [i,2] por cDesc := Upper (aArray [i,2]) y
If aArray2 [j,2] $ cDesc por If Upper (aArray2 [j,2]) $ cDesc
Corrige al sabio y lo harás más sabio, Corrige al necio y lo harás tu enemigo.
WhatsApp / Telegram: +54 911-63016162
User avatar
AUGE_OHR
Posts: 2093
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: Proceso de conciliación / comparar datos dos Grid

Post by AUGE_OHR »

hi,

i don´t "think" that "" mean next line ... all between 01/DIC are IHMO same Record

in your 2nd GRID, with import Data, there are only Debit no Credit :o

---

in Europa you can "send" Data using IBAN Format and "get" Data in same Format
i would ask for IBAN Format which is used International
have fun
Jimmy
Post Reply