Page 1 of 1

Insertar un registro en mitad de la factura...

Posted: Thu Dec 06, 2007 2:15 pm
by pymsoft
Una cosa que siempre me han pedido mis clientes y por cuestiones de tiempo nunca lo hice, pero en estos dias me puse a resolver estos problemas pequeños.
Cuando hay un documento/factura con muchas lineas, y el cliente se "olvida" de escribir una linea en determinado lugar, luego quiere la posibilidad de insertar una linea a la mitad del documento, lo que hice fue dar la posibilidad de cambiar las lineas que estan en el documento hacia arriba y hacia abajo y que el puntero del browse se quede en el mismo lugar, seguramente existe una manera mejor, yo lo hice asi, supongo que alguien lo podrá "normalizar", espero que a alguien le sirva.

(Considerando que no tengo numeradas las lineas de la factura, sino, sería todo mas facil, bastaría un indice y cambiar los numeros de linea y listo el pollo como dijo alguien...)

Code: Select all

***************
STATIC FUNCTION SpostaRiga( nOp, oLbxMov )
***************
LOCAL nRec := tmpcor->( recno() ), I, XX
LOCAL aTmpCor := {}, aTmpCor2 := {}
LOCAL nAt 

  IF nOp = 1 // SU
    IF nRec = 1
      MsgBeep()
      oLbxMov:setFocus()
      RETURN NIL
    ENDIF
  ELSEIF nOp = 2 // GIU
    IF nRec = tmpcor->( RECCOUNT() )  
      MsgBeep()
      oLbxMov:setFocus()
      RETURN NIL
    ENDIF
  ENDIF

  CursorWait()
  nAt := oLbxMov:nRowPos

  // CARICO TUTTI I DATI IN UN ARRAY
  tmpcor->( DBEVAL( {|| tmpcor->( aTuttoIlRecord( @aTmpCor ) )  } ) )

  // cancello dati
  tmpcor->( FLOCK() )
  tmpcor->( dbZap() )


  // ordino i dati
  IF nOp = 1 // SU

    FOR i := 1 TO nRec - 2 // dove si trova la riga da spostare
      AADD( aTmpcor2, aTmpCor[i] )
    NEXT

    AADD( aTmpCor2, aTmpCor[nRec] )
    AADD( aTmpCor2, aTmpCor[nRec-1] )

    FOR i := nRec + 1 TO LEN( aTmpCor )
      AADD( aTmpcor2, aTmpCor[i] )
    NEXT

  ELSEIF nOp = 2 // GIU

    FOR i := 1 TO nRec - 1 // dove si trova la riga da spostare
      AADD( aTmpcor2, aTmpCor[i] )
    NEXT

    AADD( aTmpCor2, aTmpCor[nRec+1] )
    AADD( aTmpCor2, aTmpCor[nRec] )

    FOR i := nRec + 2 TO LEN( aTmpCor )
      AADD( aTmpcor2, aTmpCor[i] )
    NEXT

  ENDIF


  // inserisco dati
  FOR i := 1 TO LEN( aTmpCor2 )
    tmpcor->( add_rec() )
    FOR xx=1 TO LEN( aTmpCor2[i] )
      tmpcor->( fieldput( xx, aTmpcor2[i,xx] ) )
    NEXT
  NEXT

  tmpcor->( dbUnLock() )
  tmpcor->( dbGoTo( nRec + IIF( nOp=1, -1, 1 ) ) )

  IF nOp = 1
    IF nRec <= nAt
      oLbxMov:GoUp()
    ENDIF
    IF nRec = 2
      oLbxMov:BugUp()
    ENDIF
  ELSEIF nOp = 2
    IF nRec <= nAt
      //oLbxMov:GoDown()
    ENDIF
  ENDIF


  oLbxMov:setFocus()
  oLbxMov:refresh(.T.)
  CursorArrow()

RETURN NIL
*
** eof SpostaRiga

***************
STATIC FUNCTION aTuttoIlRecord( aTmpCor )
***************
LOCAL aRecord := {}, I
LOCAL cAlias := ALIAS( SELECT() )
LOCAL nRC 

  nRc := (cAlias)->( FCOUNT() )

  FOR i := 1 TO nRC
    AADD( aRecord, (cAlias)->( fieldGet(i) ) )
  NEXT

  AADD( aTmpCor, aRecord )

RETURN aRecord
*
** eof aTuttoIlRecord
Saludos