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

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

Post by jparada »

Claudio Ricardo wrote: Wed Feb 17, 2021 5:26 pm 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
Hola Claudio,
Avancé un poco más tomando tu código y tu idea, intenté hacer otra implementación basándome en ésta función:

viewtopic.php?f=5&t=6604&p=63487&hilit= ... ING#p63487

con la idea de dividir en trozos la descripción del movimiento del banco e ir comparando contra la descripción del segundo array de los movimientos auxiliares, al parecer el código funciona, pero el detalle es que de 1000 movimientos (el archivo Excel del banco tiene 1000 filas y el archivo Excel de los movimientos auxiliar de contabilidad tiene 1000 filas), sólo está encontrando muy pocas coincidencias poco más de 20 y pues eso no es algo muy útil.

Aquí el código:

Code: Select all

/*
  main
*/
FUNCTION main()
  LOCAL cDesc, dDate, nCargo, nAbono
  LOCAL aArray1 := { }
  LOCAL aArray2 := { }
  LOCAL i, j, x
  LOCAL cArchivo := hb_dirBase() + 'resultado.log'
  LOCAL lNuevo

  IF File(cArchivo)		
	  hb_vfErase(cArchivo)
  ENDIF

  aArray1 := DatosBanco()
  aArray2 := DatosAux()  
  
  FOR i := 1 TO Len(aArray1)
    dDate := aArray1 [i,1]
    cDesc := aArray1 [i,2] // descripción del banco      
		nCargo := aArray1 [i,3]
		nAbono := aArray1 [i,4]

    aRet :=  SplitString(cDesc , 30, ' ')

    FOR j := 1 TO Len(aRet)
      //crearArchivo( cArchivo,  hb_NToS(j) + Space(3) + 'texto a comparar --> ' + aRet[j] + hb_eol(), @lNuevo )
      FOR x: = 1 TO Len(aArray2)  // arreglo datos auxiliar          
        IF aArray2 [x,3] == nCargo .AND. aArray2 [x,4] == nAbono
          IF aRet[j] $ aArray2 [x,2]              
            //crearArchivo( cArchivo, 'texto a comparar --> ' + aRet[j] + ;
            //                       ' contra --> ' + aArray2 [x,2] + hb_eol(), @lNuevo )

            // test
            // auxiliar
            ? 'fila ' + hb_NToS(x)  + ' del Auxiliar --> ' + aArray2 [x,2]  + ;
            ' Cargo --> ' + hb_NToS(aArray2 [x,3])  + ;
            ' Abono --> ' + hb_NToS(aArray2 [x,4])

            // banco
            ? 'fila ' + hb_NToS(i)  + ' del Banco  -->   ' + cDesc + ;
            ' Cargo --> ' + hb_NToS(nCargo) + ;
            ' Abono --> ' + hb_NToS(nAbono)

            CrearArchivo( cArchivo, 'fila ' + hb_NToS(x)  + ' del Auxiliar --> ' + aArray2 [x,2]  + ;
                                    ' Cargo --> ' + hb_NToS(aArray2 [x,3])  + ;
                                    ' Abono --> ' + hb_NToS(aArray2 [x,4]) + hb_eol(), @lNuevo )


            CrearArchivo( cArchivo, 'fila ' + hb_NToS(i)  + ' del Banco  -->   ' + cDesc + ;
                                    ' Cargo --> ' + hb_NToS(nCargo) + ;
                                    ' Abono --> ' + hb_NToS(nAbono) + hb_eol(), @lNuevo )
            // test
          ENDIF
        ENDIF
      NEXT x      
    NEXT j
  NEXT i  

  ? 'Terminado...'

RETURN NIL
/*********/

/*
  SplitString
*/
FUNCTION SplitString(cString, nLen, cSplitChar)
  LOCAL aOrphans := { "the", "a", "an" }
  LOCAL aSplitString := {}
  LOCAL cSplitString := ""
  LOCAL aTokens, i, cLastWord

  hb_default(@cString, '' )
  hb_default(@nLen, 1 )
  hb_default(@cSplitChar, ' ')

  aTokens := hb_ATokens( cString, cSplitChar )

  FOR i := 1 TO Len( aTokens )
	  IF Len ( cSplitString ) + Len ( aTokens [i] ) <= nLen 
		  cSplitString += aTokens [i] + IF ( Len ( cSplitString ) + Len ( aTokens [i] ) < nLen .AND. i < Len( aTokens ) , cSplitChar, "")
	  ELSE
		  cSplitString := AllTrim ( cSplitString )

		  /* don't leave "orphans" (ex. English article) at the end of the string */
		  cLastWord := StrTran ( SubStr( cSplitString, RAt ( " ",  cSplitString ) + 1), cSplitChar, "")

		  IF AScan ( aOrphans, { |x| Upper(x) == Upper( cLastWord ) } ) > 0
			  cSplitString := Left ( cSplitString, Len ( cSplitString ) - Len ( cLastWord ) )
			  AADD ( aSplitString, AllTrim ( cSplitString ) )		
			  cSplitString := cLastWord + cSplitChar + aTokens [i] + IF ( i < Len( aTokens ) , cSplitChar, "")
		  ELSE
			  AADD ( aSplitString, AllTrim ( cSplitString ) )		
			  cSplitString := aTokens [i] + IF ( i < Len( aTokens ) , cSplitChar, "")
		  ENDIF
	  ENDIF
  NEXT i
  AADD ( aSplitString, Alltrim (cSplitString ) )		

RETURN aSplitString
/*********/

/*
* DatosAux
*/	
FUNCTION DatosAux()
  LOCAL oError  
  LOCAL oExcel
  LOCAL oWorkBook, oHoja, nFilas
  LOCAL i 
  LOCAL fecha, descripcion, cargo, abono  
  LOCAL aMovtos := { }

  IF( oExcel := win_oleCreateObject( "Excel.Application" ) ) == NIL
    ? 'Error: Microsoft Excel no está disponible, ', win_OleErrorText()
    RETURN NIL
  ENDIF

  oExcel:Visible := .f.
  oExcel:DisplayAlerts := .f.
  oWorkBook := oExcel:WorkBooks:Open( "C:\EdoCuentaBanco\hmg\auxiliar.xlsx" )

  oExcel:Sheets(1):Select()
  oHoja  := oExcel:ActiveSheet
  nFilas := oHoja:UsedRange:Rows:Count()  

  FOR i := 2 TO nFilas
	  fecha	:= Cell2Chr( oHoja:cells(i,1):value )		
    descripcion	:= Cell2Chr( oHoja:cells(i,4):value )     
    cargo	:= Cell2Val( oHoja:cells(i,6):value )
    abono	:= Cell2Val( oHoja:cells(i,7):value )		
			
    AAdd( aMovtos, { fecha, Alltrim(descripcion), cargo, abono } )
  NEXT
  
  oWorkBook:Close()
  oExcel:Quit()
  oHoja     := NIL
  oWorkBook := NIL
  oExcel    := NIL
  
	/*
  RELEASE oHoja
  RELEASE oWorkBook
  RELEASE oExcel    
  */

RETURN (aMovtos)
/*********/

/*
* DatosBanco
*/
FUNCTION DatosBanco()
  LOCAL oError  
  LOCAL oExcel
  LOCAL oWorkBook, oHoja, nFilas
  LOCAL i 
  LOCAL fecha, descripcion, cargo, abono  
	LOCAL aMovtos := { }
	
  IF( oExcel := win_oleCreateObject( "Excel.Application" ) ) == nil
    ? 'Error: Microsoft Excel no está disponible, ', win_OleErrorText()
    RETURN NIL
  ENDIF
  
  oExcel:Visible := .f.
  oExcel:DisplayAlerts := .f.
  oWorkBook := oExcel:WorkBooks:Open( "C:\EdoCuentaBanco\hmg\banco.xlsx" )

  oExcel:Sheets(1):Select()
  oHoja  := oExcel:ActiveSheet
  nFilas := oHoja:UsedRange:Rows:Count()  
	
  FOR i := 2 TO nFilas
	  fecha	:= Cell2Chr( oHoja:cells(i,1):value )		
    descripcion	:= Cell2Chr( oHoja:cells(i,2):value )     
    cargo	:= Cell2Val( oHoja:cells(i,3):value )
    abono	:= Cell2Val( oHoja:cells(i,4):value )
				
		AAdd( aMovtos, { fecha, Alltrim(descripcion), cargo, abono } )
  NEXT
  
  oWorkBook:Close()
  oExcel:Quit()
  oHoja     := NIL
  oWorkBook := NIL
  oExcel    := NIL
  
	/*
  RELEASE oHoja
  RELEASE oWorkBook
  RELEASE oExcel    
  */

RETURN (aMovtos)
/*********/
Éste código se puede mejorar para intentar obtener mejores resultados?, alguna extra ayuda por favor.

Gracias.

Saludos,
Javier
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 »

Javier,

Arrays are both sorted in same way?

Serge
There's nothing you can do that can't be done...
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 Javier...
Eso es porque la función que postee busca coincidencia exacta en los campos Fecha y los
dos campos numéricos además de algún tipo de coincidencia en el campo Descripción
Puedes probar comentando las lineas de este último, y dejando sólo las de Fecha y numéricos,
y a criterio del usuario si la Descripción es relevante...
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 »

serge_girard wrote: Fri Feb 19, 2021 9:25 pm Javier,

Arrays are both sorted in same way?

Serge
Hi Serge,
Nop, the data is taken exactly as it is in the Excel files, does that matter?.

Regards,
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 »

Observé que en el grid de abajo la fecha se muestra con el año en 2 digitos...
En el If yo usé: " aArray2 [j,1] == dDate " y no debería coincidir...
Tal vez con Set Century On o cambiando ambos formatos a character.
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 »

Claudio Ricardo wrote: Fri Feb 19, 2021 9:59 pm Hola Javier...
Eso es porque la función que postee busca coincidencia exacta en los campos Fecha y los
dos campos numéricos además de algún tipo de coincidencia en el campo Descripción
Puedes probar comentando las lineas de este último, y dejando sólo las de Fecha y numéricos,
y a criterio del usuario si la Descripción es relevante...
Hola Claudio,
Pero si te diste cuenta lo que comenté, es que estoy tratando de dividir en trozos la descripción y luego comparar, porque sí me di cuenta del detalle de la comparación exacta, no sé si sea buena idea sólo comparar fechas e importes, pero de cualquier forma voy a hacer una prueba, caray estaba pensando que la conciliación era más fácil de resolver a nivel técnico jejeje.

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

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

Post by jparada »

Claudio Ricardo wrote: Fri Feb 19, 2021 10:29 pm Observé que en el grid de abajo la fecha se muestra con el año en 2 digitos...
En el If yo usé: " aArray2 [j,1] == dDate " y no debería coincidir...
Tal vez con Set Century On o cambiando ambos formatos a character.
Eso ya también lo cambié en los archivos Excel ambos archivos ya tienen el mismo formato.

Saludos,
Javier
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 »

Javier,

Nop, the data is taken exactly as it is in the Excel files, does that matter?.
Try to have both arrays ordered in the same key.

Serge
There's nothing you can do that can't be done...
franco
Posts: 877
Joined: Sat Nov 02, 2013 5:42 am
DBs Used: DBF
Location: Canada

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

Post by franco »

Could you use temporary tables instead of arrays, much easier to work with I think.
All The Best,
Franco
Canada
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 »

Or DBF tables. Make sure that the keys you are comparing are of equal format (date, century, numeric, trimmed chars...)

It can't be that hard

Serge
There's nothing you can do that can't be done...
Post Reply