Patch level : 10.0 272

Files correlati     : mg1.exe mg1100.msk
Ricompilazione Demo : [ ]
Commento            :
0001216: Righe automatiche di movimento magazzino
Modificando un movimento di magazzino che deriva da documento, mi permette di modificare il codice del magazzino sulla riga. Tutto il resto, a parte il prezzo, è disabilitato.


git-svn-id: svn://10.65.10.50/trunk@18622 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2009-03-27 10:40:23 +00:00
parent b50b89232f
commit b3a42fe53d
5 changed files with 106 additions and 82 deletions

View File

@ -4,10 +4,13 @@
#include "../db/dblib.h"
#include "../ve/veconf.h"
#include <relapp.h>
#include <defmask.h>
#include <relapp.h>
#include <msksheet.h>
#include "anamag.h"
#include "rmovmag.h"
#include "mg1100.h"
#include <cfven.h>
@ -23,13 +26,16 @@ class TMask_movmag : public TMask
int _autorows;
TArray _old_qta;
bool _check_giac;
TMagazzini _magazzini;
protected:
virtual bool on_key(KEY key);
protected:
// aggiorna la riga di magazzino aggiungendo righe automatiche o esplosioni
bool update_rigamov(int r, const char * old_codcaus, const char * old_codart, const real & old_quant);
bool add_autorows(int r, const char * old_codcaus, const char * old_codart, const real & old_quant);
bool add_explrows(int r);
TMagazzini _magazzini;
void qta_inventory(real & qta);
@ -46,18 +52,18 @@ class TMask_movmag : public TMask
static bool codgrp_handler(TMask_field &fld, KEY k); // handler del codice gruppo
static void sheetrighe_put(TSheet_field &fld_righe, int item);
static void sheetrighe_get(TSheet_field &fld_righe, int item);
public:
TArticolo_giacenza& curr_art();
TArray & old_qta() { return _old_qta; }
void update_tot();
TArray& old_qta() { return _old_qta; }
const TMagazzini& magazzini() const { return _magazzini; }
int autorows() const { return _autorows;}
void update_tot();
TMask_movmag(TMov_mag* m_m);
virtual ~TMask_movmag();
};
// HANDLER DEL CODICE LIVELLO anagrafica
bool TMask_movmag::codgrp_handler(TMask_field& f, KEY k)
{
@ -66,7 +72,7 @@ bool TMask_movmag::codgrp_handler(TMask_field& f, KEY k)
if (!livelli_giacenza().enabled())
{
f.error_box(TR("Livelli del codice non abilitati"));
return FALSE;
return false;
}
const int levnum=1+f.dlg()-F_LIV1;
return livelli_giacenza().autoinsert(levnum,f);
@ -74,11 +80,33 @@ bool TMask_movmag::codgrp_handler(TMask_field& f, KEY k)
return true;
}
bool TMask_movmag::on_key(KEY key)
{
if (key == K_SHIFT+K_F12 && edit_mode())
{
if (!field(DLG_SAVEREC).active()) // Riabilita bottoni spenti dalla protected_mode
{
enable(DLG_SAVEREC);
enable(DLG_DELREC);
}
TSheet_field& ss = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(ss, i, row)
{
const char tipo = row->get_char(0);
if (tipo > ' ')
ss.enable_row(i);
}
ss.force_update();
return true;
}
return TMask::on_key(key);
}
// costruttore della maschera anagrafica di magazzino
//TMask_movmag::TMask_movmag() :
TMask_movmag::TMask_movmag(TMov_mag * m_m)
: TMask("mg1100")
TMask_movmag::TMask_movmag(TMov_mag * m_m) : TMask("mg1100")
{
_mov_mag = m_m;
// setta handler e notify
@ -124,7 +152,6 @@ TMask_movmag::TMask_movmag(TMov_mag * m_m)
ss.enable_column(ss.cid2index(F_CODDEP),gd);
_autorows = prassid.get_int("AUTOROWS", "mg");
_check_giac = prassid.get_bool("CHECK_GIAC", "mg");
}
@ -136,8 +163,9 @@ TMask_movmag::~TMask_movmag()
void TMask_movmag::sheetrighe_get(TSheet_field &fld_righe, int item)
{
// prende il record della riga corrente dal record array
TRectype &rec= fld_righe.record()->row(item, TRUE);
TToken_string &row= fld_righe.row(item-1);
TRectype& rec = fld_righe.record()->row(item, true);
TToken_string& row = fld_righe.row(item-1);
// codici di livello
row.add( livelli_giacenza().unpack_grpcode(rec.get("LIVGIAC") ,1),fld_righe.cid2index(F_LIV1) );
row.add( livelli_giacenza().unpack_grpcode(rec.get("LIVGIAC") ,2),fld_righe.cid2index(F_LIV2) );
@ -150,7 +178,7 @@ void TMask_movmag::sheetrighe_put(TSheet_field &fld_righe, int item)
{
TToken_string &row= fld_righe.row(item-1);
TRectype &recrighe= fld_righe.record()->row(item, TRUE);
TRectype &recrighe= fld_righe.record()->row(item, true);
// codici livello
if (livelli_giacenza().enabled())
{
@ -186,7 +214,7 @@ bool TMask_movmag::handle_righe(TMask_field &f, KEY k)
}
}
}
return TRUE;
return true;
}
void TMask_movmag::update_tot()
@ -233,7 +261,7 @@ bool TMask_movmag::notify_righe(TSheet_field& ss, int r, KEY key)
if ( key == K_DEL ) // Cancellazione
{
if (*ss.cell(r,ss.cid2index( F_AUTOMATICA))==riga_automatica)
return FALSE; // can't remove auto lines directly
return false; // can't remove auto lines directly
while (r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA))==riga_automatica)
{
// autoremove automatic lines along with the original one
@ -247,7 +275,7 @@ bool TMask_movmag::notify_righe(TSheet_field& ss, int r, KEY key)
m.update_tot();
} else if (key == K_INS) { // Inserimento
if (r < ss.items() && *ss.cell(r,ss.cid2index( F_AUTOMATICA))==riga_automatica)
return FALSE; // cannot insert between a row and its generated one
return false; // cannot insert between a row and its generated one
} else
if (key == K_CTRL + K_INS) { // Inserimento accordato
@ -374,7 +402,7 @@ bool TMask_movmag::handle_righeprezzo1(TMask_field &f, KEY k)
{
if (f.mask().get(F_PREZZO).blank())
return handle_righeprezzo2(f, k);
return TRUE;
return true;
}
// proposta hard: propone il prezzo in ogni caso
@ -396,7 +424,7 @@ bool TMask_movmag::handle_righeprezzo2(TMask_field &f, KEY k)
}
mmm._price_codart = codart;
}
return TRUE;
return true;
}
bool TMask_movmag::handle_checksosp(TMask_field &f, KEY k)
@ -421,7 +449,7 @@ bool TMask_movmag::handle_checksosp(TMask_field &f, KEY k)
return error_box(FR("Articolo %s sospeso, quindi non movimentabile"), (const char *)f.get());
}
}
return TRUE;
return true;
}
bool TMask_movmag::handle_codarticolo(TMask_field &f, KEY k)
@ -475,11 +503,11 @@ bool TMask_movmag::handle_causrig(TMask_field &f, KEY k)
if (k==K_TAB && f.focusdirty())
{
if (!handle_checksosp(f, k))
return FALSE;
return false;
handle_righeprezzo1(f, k);
}
return TRUE;
return true;
}
// proposta hard: propone il prezzo in ogni caso
@ -504,13 +532,13 @@ bool TMask_movmag::handle_giacattuale(TMask_field &f, KEY k)
if (um.not_empty())
{
TArticolo_giacenza & art = cached_article_balances(maskrighe.get(F_CODART));
real disp = art.disponibilita(maskmov.get(F_ANNOES),codmag,codliv,TRUE);
real disp = art.disponibilita(maskmov.get(F_ANNOES),codmag,codliv,true);
disp = art.convert_to_um(disp, um, NULL, false);
f.set(disp.string());
}
}
return TRUE;
return true;
}
@ -525,8 +553,8 @@ bool TMask_movmag::update_rigamov (int r, const char * old_codcaus, const char *
bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * old_codart, const real & old_quant)
{
bool added_some=FALSE;
TSheet_field & ss=(TSheet_field & )field(F_RIGHE);
bool added_some=false;
TSheet_field & ss= sfield(F_RIGHE);
real new_factor(ss.cell(r,ss.cid2index(F_QUANT)));
new_factor = old_quant.is_zero() ? ZERO : new_factor / old_quant;
TString8 new_codcaus(ss.cell(r,ss.cid2index(F_CAUSRIG)));
@ -535,7 +563,7 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o
const TCausale_magazzino oldcau(old_codcaus);
const TCausale_magazzino cau(new_codcaus);
bool rimuovi_righe_coll=FALSE;
bool rimuovi_righe_coll=false;
bool inserisci_righe_coll= *cau.caus_collegata()!='\0' && *ss.cell(r,ss.cid2index(F_ESPLOSA)) == ' ';
if (inserisci_righe_coll)
{
@ -545,7 +573,7 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o
if (old_codcaus != new_codcaus)
{
rimuovi_righe_coll = TRUE;
rimuovi_righe_coll = true;
}
else
if ((r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA)) == riga_automatica)
@ -553,14 +581,14 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o
{
if (strcmp(old_codart,ss.cell(r,ss.cid2index( F_CODART)))!=0 )
// ho cambiato il codice articolo del finito: rimuovo le righe automatiche esplose
rimuovi_righe_coll = TRUE;
rimuovi_righe_coll = true;
else
inserisci_righe_coll=FALSE;
inserisci_righe_coll=false;
}
}
else
if (*oldcau.caus_collegata()!='\0') // ho cambiato causale, passando ad una che non ha collegamenti
rimuovi_righe_coll=TRUE;
rimuovi_righe_coll=true;
// ******************
if (rimuovi_righe_coll)
{
@ -591,7 +619,7 @@ bool TMask_movmag::add_autorows (int r, const char * old_codcaus, const char * o
if (cau_coll.has_default_dep())
newrow.add(dep,ss.cid2index(F_CODDEP));
COPIA_SU_AUTO(F_PREZZO);
added_some= TRUE;
added_some= true;
}
while (r+offset < ss.items() && *ss.cell(r+offset,ss.cid2index( F_AUTOMATICA))==riga_automatica)
{
@ -632,7 +660,7 @@ bool TMask_movmag::add_explrows(int r)
if (new_codcaus.blank())
new_codcaus=get(F_CODCAUS);
bool added_some=FALSE;
bool added_some=false;
const TCausale_magazzino cau(new_codcaus);
TArticolo articolo;
@ -646,7 +674,7 @@ bool TMask_movmag::add_explrows(int r)
// c'e' una riga di movimento esplodente non ancora esplosa:
// va sostituita con n righe esplose
real prezzo,quant;
const char tipo_costo = cau.get("S11")[0];
const char tipo_costo = cau.get_char("S11");
const int livello = cau.get_int("I0");
const TString codart = sheet.cell(r,sheet.cid2index(F_CODART));
bool ok = distinta.set_root(codart);
@ -654,7 +682,7 @@ bool TMask_movmag::add_explrows(int r)
const bool is_coll = rigaprec >= 0 && *sheet.cell(r, sheet.cid2index(F_AUTOMATICA)) == riga_automatica;
if (ok)
{
distinta.explode(boom, TRUE, RAGGR_EXP_NONE, livello, "A");
distinta.explode(boom, true, RAGGR_EXP_NONE, livello, "A");
for (int newrow=0; newrow < boom.items() ; newrow++)
{
TRiga_esplosione & riga_esp=(TRiga_esplosione & )(boom[newrow]);
@ -707,7 +735,7 @@ bool TMask_movmag::add_explrows(int r)
sheet.check_row(r+1+newrow);
sheet.force_update(r+1+newrow);
added_some=TRUE;
added_some=true;
}
// elimino la riga "padre"
if (boom.items() > 0)
@ -725,8 +753,7 @@ bool TMask_movmag::add_explrows(int r)
return added_some;
}
real TMask_movmag::proposed_price(const char *codart,
real quant, const char *causrig)
real TMask_movmag::proposed_price(const char *codart, real quant, const char *causrig)
{
real rv;
@ -776,7 +803,7 @@ bool TMask_movmag::handle_codcaus(TMask_field &fld, KEY k)
// aggiorna le righe di sheet
TMask_movmag &m=(TMask_movmag &)fld.mask();
TSheet_field & ss=(TSheet_field & )m.field(F_RIGHE);
bool added_some = FALSE;
bool added_some = false;
// aggiorna le righe che dipendono dalla causale movimento
for (int i=0; i< ss.items(); i++)
@ -792,7 +819,7 @@ bool TMask_movmag::handle_codcaus(TMask_field &fld, KEY k)
}
if (k == K_TAB)
old_codcaus=fld.get();
return TRUE;
return true;
}
bool TMask_movmag::handle_datacomp(TMask_field &fld, KEY k)
@ -809,7 +836,7 @@ bool TMask_movmag::handle_datacomp(TMask_field &fld, KEY k)
else
return fld.error_box(TR("La data indicata non appartiene a nessuno degli esercizi contabili inseriti ")) ;
}
return TRUE;
return true;
}
class TApp_movmag: public TRelation_application
@ -817,31 +844,27 @@ class TApp_movmag: public TRelation_application
TMask_movmag *_msk; // maschera principale
TRelation * _rel; // relazione contenente il file movimenti
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual TMask *get_mask(int) { return _msk; }
virtual void init_query_mode(TMask&) ;
virtual void init_insert_mode(TMask&) ;
virtual void init_modify_mode(TMask&) ;
virtual bool changing_mask(int) { return FALSE; }
virtual bool changing_mask(int) { return false; }
virtual TRelation *get_relation() const { return _rel; }
virtual const char *get_next_key();
virtual bool get_next_key(TToken_string& key);
virtual int read(TMask& m);
TString16 _nextcod;
public:
TApp_movmag() {};
virtual ~TApp_movmag() {};
virtual bool protected_record(TRectype& rec);
};
inline TApp_movmag& app() { return (TApp_movmag&) main_app(); }
int TApp_movmag::read(TMask& m)
{
const int err = TRelation_application::read(m);
if (err == NOERR)
((TMask_movmag &)m).update_tot();
((TMask_movmag&)m).update_tot();
return err;
}
@ -855,9 +878,15 @@ void TApp_movmag::init_modify_mode(TMask& m)
{
m.disable(F_INVENTORYMODE);
const bool inventory = m.get_bool(F_INVENTORYMODE);
TSheet_field & ss = m.sfield(F_RIGHE);
TSheet_field& ss = m.sfield(F_RIGHE);
ss.sheet_mask().field(F_QUANT).check_type(inventory ? CHECK_NONE : CHECK_REQUIRED);
TRelation_application::init_modify_mode(m);
FOR_EACH_SHEET_ROW(ss, i, row)
{
if (*row > ' ') // Tipo riga automatico
ss.disable_row(i);
}
}
void TApp_movmag::init_insert_mode(TMask& m)
@ -866,9 +895,9 @@ void TApp_movmag::init_insert_mode(TMask& m)
const bool inventory = m.get_bool(F_INVENTORYMODE);
TSheet_field& ss = m.sfield(F_RIGHE);
ss.sheet_mask().field(F_QUANT).check_type(inventory ? CHECK_NONE : CHECK_REQUIRED);
((TMask_movmag &)m).old_qta().destroy();
((TMask_movmag&)m).old_qta().destroy();
for (int i = 0; i < ((TMask_movmag &)m).autorows(); i++)
for (int i = ((TMask_movmag&)m).autorows(); i > 0; i--)
ss.insert(-1, false, true);
TRelation_application::init_insert_mode(m);
@ -876,9 +905,9 @@ void TApp_movmag::init_insert_mode(TMask& m)
bool TApp_movmag::user_create()
{
open_files(LF_ANAMAG, LF_UMART, LF_CODCORR, LF_DESLIN, LF_MOVMAG,LF_RMOVMAG, LF_MAG, LF_STOMAG, LF_TABCOM,0);
open_files(LF_ANAMAG, LF_UMART, LF_CODCORR, LF_DESLIN, LF_MOVMAG,LF_RMOVMAG, LF_MAG, LF_STOMAG, LF_TABCOM, 0);
TMov_mag * m_m= new TMov_mag(); // record del movimento di magazzino
TMov_mag* m_m = new TMov_mag(); // record del movimento di magazzino
m_m->enable_autoload(LF_RMOVMAG);
// maschera specifica con gli handler dei movimenti
@ -887,29 +916,39 @@ bool TApp_movmag::user_create()
_rel= new TRelation(LF_MOVMAG);
_rel->lfile().set_curr(m_m);
return TRUE;
return true;
}
bool TApp_movmag::user_destroy()
{
delete _rel;
delete _msk;
return TRUE;
return true;
}
// autonumerazione
const char *TApp_movmag::get_next_key()
bool TApp_movmag::get_next_key(TToken_string& nextcod)
{
const char* nk = ((TMov_mag &)_rel->curr()).get_next_key();
return _nextcod.format("%d|%s",F_NUMREG, nk);
nextcod.format("%d|%s", F_NUMREG, nk);
return true;
}
bool TApp_movmag::protected_record(TRectype& rec)
{
bool prot = false;
TLocalisamfile rmov(LF_RMOVMAG);
rmov.put(RMOVMAG_NUMREG, rec.get(RMOVMAG_NUMREG));
rmov.put(RMOVMAG_NRIG, 1);
if (rmov.read() == NOERR)
prot = rmov.get_char(RMOVMAG_TIPORIGA) == riga_dadocumento;
return prot;
}
int mg1100(int argc, char* argv[])
{
TApp_movmag a;
a.run(argc, argv, TR("Movimenti di magazzino"));
exit(0);
return 0;
}

View File

@ -28,5 +28,4 @@
// #define F_VALORE 156
#define F_DESCAUSRIG 157
#define G_NOAUTO 1
#define ALIAS_FCG 500

View File

@ -23,9 +23,7 @@ STRING F_AUTOMATICA 1
BEGIN
PROMPT 2 1 "Tipo riga "
FIELD AUTOMATICA
FLAGS "DG"
MESSAGE EMPTY ENABLE,G_NOAUTO@
MESSAGE DISABLE,G_NOAUTO@
FLAGS "D"
END
STRING F_CODART 20
@ -42,7 +40,6 @@ BEGIN
OUTPUT F_DESART DESCR
OUTPUT F_UM LF_UMART->UM
CHECKTYPE SEARCH
GROUP G_NOAUTO
ADD RUN ve2 -3
MESSAGE CHECK,F_GIAC
END
@ -58,7 +55,6 @@ BEGIN
DISPLAY "Codice@20" CODART
COPY OUTPUT F_CODART
CHECKTYPE NORMAL
GROUP G_NOAUTO
ADD RUN ve2 -3
END
@ -161,7 +157,6 @@ BEGIN
OUTPUT F_LIV1 CODTAB[2,16]
CHECKTYPE NORMAL
MESSAGE EMPTY CHECK,F_GIAC|CLEAR,F_LIV2|CHECK,F_LIV2
GROUP G_NOAUTO
MESSAGE CHECK,F_GIAC|ENABLE,F_LIV2
END
@ -176,7 +171,6 @@ BEGIN
COPY DISPLAY F_LIV1
OUTPUT F_LIV2 CODTAB[2,16]
CHECKTYPE NORMAL
GROUP G_NOAUTO
MESSAGE EMPTY CHECK,F_GIAC|CLEAR,F_LIV3|CHECK,F_LIV3
MESSAGE CHECK,F_GIAC|ENABLE,F_LIV3
END
@ -191,7 +185,6 @@ BEGIN
COPY DISPLAY F_LIV1
OUTPUT F_LIV3 CODTAB[2,16]
CHECKTYPE NORMAL
GROUP G_NOAUTO
MESSAGE EMPTY CHECK,F_GIAC|CLEAR,F_LIV4|CHECK,F_LIV4
MESSAGE CHECK,F_GIAC|ENABLE,F_LIV4
END
@ -206,7 +199,6 @@ BEGIN
COPY DISPLAY F_LIV1
OUTPUT F_LIV4 CODTAB[2,16]
CHECKTYPE NORMAL
GROUP G_NOAUTO
MESSAGE CHECK,F_GIAC
END
@ -225,7 +217,6 @@ BEGIN
OUTPUT F_UM UM
OUTPUT F_UMFC FC
CHECKTYPE REQUIRED
GROUP G_NOAUTO
END
NUMBER F_QUANT 15 5
@ -234,7 +225,6 @@ BEGIN
FIELD QUANT
CHECKTYPE REQUIRED
WARNING "Indicare la quantità"
GROUP G_NOAUTO
MESSAGE CHECK,F_VALORE
END
@ -266,7 +256,6 @@ BEGIN
OUTPUT F_DESCAUSRIG S0
MESSAGE EMPTY RESET,F_DESCAUSRIG
ADD RUN MG0 -0 %CAU
GROUP G_NOAUTO
END
STRING F_DESCAUSRIG 50 30

View File

@ -49,12 +49,11 @@
#endif
// campi comuni alla maschere di magazzino
typedef enum {
riga_dadocumento='D', // derivata da documento
riga_automatica='A', // generata da causale collegata
riga_nongenerata=' ' // immissione direttta del mov.
typedef enum
{
riga_dadocumento = 'D', // derivata da documento
riga_automatica = 'A', // generata da causale collegata
riga_nongenerata = ' ' // immissione diretta del mov.
} TTipo_rigamovmag;
typedef enum {

View File

@ -1,6 +1,6 @@
// oggetto TCausale_magazzino
// oggetto TMov_Mag , multirecord del movimento di magazzino
// funzione di ricostruzione saldi
// funzione di ricostruzione saldi
#include <diction.h>
#include <progind.h>
@ -10,7 +10,6 @@
#include "clifogiac.h"
#include "mglib.h"
#include "movmag.h"
#include "rmovmag.h"
#include <cfven.h>
#ifndef __CGLIB01_H
@ -20,7 +19,6 @@
#include "../db/dblib.h"
#endif
class TSaldo_mag : public TObject
{
int _codes;