package bpntojava.model.bpndata;
import java.util.LinkedList;
import jp.ne.so_net.ga2.no_ji.jcom.IDispatch;
/**
* Daten aus der BPN sammeln.
*
* @author mschuessler
*/
public class CatchData {
/**
* BPN-Tools.
*/
private BPN bpn;
/**
* Data-Datenbank.
*/
private Data data;
/**
* Außendienst-Datenbank.
*/
private Data ad;
/**
* Konstruktor.
*
* @param bpn BPN-Tools.
*/
public CatchData(BPN bpn) {
this.bpn = bpn;
data = new Data();
ad = new Data();
}
/**
* Gibt Data-Datenbank zurück.
*
* @return Data
*/
public Data getData() {
fillArchVorg();
return data;
}
/**
* Gibt Außendienst-Datenbank zurück.
*
* @return Außendienst
*/
public Data getAD() {
fillAD();
return ad;
}
/**
* Füllt die Außendienst Datenbank.
*/
private void fillAD() {
IDispatch archvorg = bpn.getDataSet("VorgangArchiv");
IDispatch archvorgpos = bpn.getDataSet("VorgangPositionArchiv");
IDispatch archvorgangposfields = bpn.getFields(archvorgpos);
LinkedList<String> adList = getADList();
bpn.sort(archvorgpos, "ArtNr");
for (String artnummer : adList) {
bpn.setRange(archvorgpos, "ArtNr", artnummer, artNrPlusEins(artnummer));
bpn.first(archvorgpos);
IDispatch id = bpn.getItem(archvorgangposfields, "ID");
String lastItem = "";
String actualItem = bpn.itemAsString(id);
while (hasnext(lastItem, actualItem)) {
if (bpn.itemAsString(
bpn.getItem(archvorgangposfields, "BelegNr")).startsWith("RE")) {
DataLine toReturn = new DataLine();
toReturn.add("" + getBelegDatum(archvorg, bpn.itemAsString(
bpn.getItem(archvorgangposfields, "BelegNr"))));
toReturn.add("" + bpn.itemAsString(bpn.getItem(archvorgangposfields, "ArtNr")));
toReturn.add("" + bpn.getItemInfo(archvorgangposfields, "Bez"));
String preis = bpn.itemAsString(bpn.getItem(archvorgangposfields, "PrNt"));
toReturn.add("" + preis.replace(',', '.'));
ad.add(toReturn);
}
lastItem = bpn.itemAsString(id);
bpn.next(archvorgpos);
actualItem = bpn.itemAsString(id);
}
}
}
/**
* Gibt das Datum des gerade ausgewählten Beleges zurück.
*
* @param archvorg DataSet
* @param belegnr Belegnummer
* @return Datum
*/
private String getBelegDatum(IDispatch archvorg, String belegnr) {
bpn.sort(archvorg, "BelegNr");
bpn.setRange(archvorg, "BelegNr", belegnr, belegNrPlusEins(belegnr));
bpn.first(archvorg);
IDispatch archvorgfields = bpn.getFields(archvorg);
String toReturn = bpn.itemAsString(bpn.getItem(archvorgfields, "Dat"));
return toReturn.substring(3);
}
/**
* Liste der Außendienst-Artikelnummern.
*
* @return Liste
*/
private LinkedList<String> getADList() {
LinkedList<String> toReturn = new LinkedList();
toReturn.add("10044001");
toReturn.add("10044002");
toReturn.add("10044003");
toReturn.add("10044004");
toReturn.add("10044005");
toReturn.add("10044006");
toReturn.add("10044007");
toReturn.add("10044008");
toReturn.add("10044009");
toReturn.add("10044010");
toReturn.add("10044011");
toReturn.add("10044012");
return toReturn;
}
/**
* Füllt die Data-Datenbank.
*/
private void fillArchVorg() {
IDispatch archvorg = bpn.getDataSet("VorgangArchiv");
IDispatch archvorgpos = bpn.getDataSet("VorgangPositionArchiv");
IDispatch archvorgfields = bpn.getFields(archvorg);
bpn.sort(archvorg, "ArtBelegNr");
bpn.setRange(archvorg, "Art", "70", "71");
bpn.first(archvorg);
IDispatch vorgvorgID = bpn.getItem(archvorgfields, "BelegNr");
String vorglastItem = "";
String vorgactualItem = bpn.itemAsString(vorgvorgID);
while (hasnext(vorglastItem, vorgactualItem)) {
IDispatch vorgbelegNr = bpn.getItem(archvorgfields, "BelegNr");
String belegNrString = bpn.itemAsString(vorgbelegNr);
if (!bpn.itemAsString(bpn.getItem(archvorgfields, "Sel49")).equals("")) {
fillArchPos(archvorgpos, archvorgfields, belegNrString);
}
vorglastItem = bpn.itemAsString(vorgvorgID);
bpn.next(archvorg);
vorgactualItem = bpn.itemAsString(vorgvorgID);
}
}
/**
* Füllt die Positionen.
*
* @param archvorgpos DataSet
* @param vorgang DataSet
* @param belegnummer Belegnummer
*/
private void fillArchPos(IDispatch archvorgpos, IDispatch vorgang, String belegnummer) {
IDispatch archvorgangposfields = bpn.getFields(archvorgpos);
bpn.sort(archvorgpos, "Nr");
bpn.setRange(archvorgpos, "BelegNr", belegnummer, belegNrPlusEins(belegnummer));
bpn.first(archvorgpos);
IDispatch posID = bpn.getItem(archvorgangposfields, "ID");
String lastItem = "";
String actualItem = bpn.itemAsString(posID);
while (hasnext(lastItem, actualItem)) {
addPosDataLine(archvorgangposfields, vorgang);
lastItem = bpn.itemAsString(posID);
bpn.next(archvorgpos);
actualItem = bpn.itemAsString(posID);
}
}
/**
* Gibt die Belegnummer +1 zurück.
*
* @param belegnummer Belegnummer
* @return neue Belegnummer
*/
private String belegNrPlusEins(String belegnummer) {
String bla = belegnummer.substring(2);
int nr = Integer.parseInt(bla);
nr++;
if (bla.charAt(0) == '0') {
return "RE0" + nr;
}
return "RE" + nr;
}
/**
* Gibnt die Artikelnummer +1 zurück.
*
* @param belegnummer Artikelnummer
* @return Artikelner+1
*/
private String artNrPlusEins(String belegnummer) {
if (belegnummer.equals("10044009")) {
return "10044010";
}
int i = Integer.parseInt(String.valueOf(belegnummer.charAt(belegnummer.length() - 1)));
i++;
String toReturn = belegnummer.substring(0, belegnummer.length() - 1) + i;
return toReturn;
}
/**
* Position in die Datenbank packen.
*
* @param field Field
* @param vorgang DataSet
*/
private void addPosDataLine(IDispatch field, IDispatch vorgang) {
String artnr = bpn.itemAsString(bpn.getItem(field, "ArtNr"));
String preis = bpn.itemAsString(bpn.getItem(field, "PrNt"));
if (artnr != null
&& !artnr.equals("0")
&& !artnr.equals("")
&& preis != null
&& !preis.equals("0")
&& !preis.equals("")) {
DataLine toReturn = new DataLine();
toReturn.add("" + bpn.itemAsString(bpn.getItem(vorgang, "Dat")).substring(3));
toReturn.add("" + bpn.itemAsString(bpn.getItem(vorgang, "Sel49")));
toReturn.add("" + artnr);
String bez = bpn.getItemInfo(field, "Bez");
toReturn.add("" + artnr + " " + bez);
toReturn.add("" + preis.replace(',', '.'));
data.add(toReturn);
//System.out.println(toReturn.output());
}
}
/**
* Überprüft ob das letzte Item gleich dem Aktuellen ist.
*
* @param last letzter String
* @param actual aktueller String
* @return true = es folgt noch ein Eintrag.
*/
private boolean hasnext(String last, String actual) {
if (last.equals(actual)) {
return false;
}
return true;
}
}