/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package owjava;

/**
 *
 * @author gdenz
 */

import java.io.File;
// JFOP-API (basic classes FO, FOe, EKS, EKSe and others)
import de.abas.eks.jfop.remote.*;
import de.abas.eks.jfop.*;
//JEDP API
import de.abas.ceks.jedp.*;
import java.io.IOException;
// JXL Java Excel API
import java.text.DateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import jxl.*;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;



public class excelimport implements FOPRunnable {



/** 
 * "main"-method, called from abas-ERP 
 *  @param arg arg[0]="Test_fop" (name of this class); 
 *             arg[1],arg[2],...: given paramters
 *  @return exitcode (0 = ok)
 */
    @SuppressWarnings("empty-statement")
public int runFop(String[] arg) throws FOPException
{


// Variablen
              Cell[] row = null;
              String Zellenstring;
              String yin =  EKS.Mvar("ydatafile");
              DateFormat longTimestamp =   DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 
              EKS.formel("M|yerrorfile=M|ydatafile<<\".xls"+"\""+"+\"error.xls\"");
              String yout =EKS.Mvar("yerrorfile");
              int errory = 1;
              Integer yfehler = 0;
              Integer yok = 0;
              String evtvar=EKS.Tvar("evtvar");
              Cell errorcell=null;
              Label l = null;
              int yport=Integer.parseInt (EKS.Mvar("yport"));
 
   
 // Workbook und Sheet öffnen                   
   try {
         
        // Import Workbook öffnen
       Workbook    workbook = Workbook.getWorkbook(new File(yin));
       Sheet sheet = workbook.getSheet(0);
       
       //Error Workbook erzeugen als Kopie von Import Workbook
        WritableWorkbook errorworkbook = Workbook.createWorkbook(new File(yout),workbook);
        WritableSheet errorsheet = errorworkbook.getSheet(0);      
        
        // Datenbank:Gruppe abholen
                                
                                Cell Zelle = sheet.getCell(0,0);
                                String dbgroup = Zelle.getContents(); 
                                int doppelpunkt =dbgroup.indexOf(":");
                                String db =dbgroup.substring(0,doppelpunkt);
                                String gruppe=dbgroup.substring((doppelpunkt+1));
                                EKS.formel("M|ydb=\""+db+"\"");
                                EKS.formel("M|ygruppe=\""+gruppe+"\"");
                                EKS.formel("M|yzeilen="+(sheet.getRows()-2));
                                String ytabelle =EKS.Mvar("ytabelle");
                           
                             
                                 // Tabelle erzeugen wenn Häkchen gesetzt
                                if (evtvar.equals("ytabelle"))
                                {
                                 EKS.mache("MASKE ZEILE --");      
                                
                                  if (EKS.Mvar("ytabelle").equals("ja"))
                                  {
                                   
                                  // EDP Session starten
                                    EDPSession sessionT = EDPFactory.createEDPSession ();
                                    try {
                                                
                                                    sessionT.beginSession(EKS.Mvar("yserver"),yport,EKS.Mvar("ymandant"),EKS.Mvar("ypasswort"), "JEDP_0001");
                                                    EDPQuery edpQT1 = sessionT.createQuery();
                                                  
                                                    String selfield=sheet.getCell(0,1).getContents();
                                                    // Schleife über alle Zeilen
                                                    for (int y = 2 ; y < sheet.getRows() ; y++)
                                                    {
                                                        
                                                        row = sheet.getRow(y);
                                                       EKS.hinweis("-SOFORT \"Lese ZEILE "+y+" "+sheet.getCell(0,y).getContents()+"\"");
                                                        // Zeile erzeugen
                                                        EKS.mache("MASKE ZEILE +");
                                                        EKS.formel("M|ysel=\""+sheet.getCell(0,y).getContents()+"\"");
                                                        // Selektion aufbauen
                                                        String selektionT=selfield+"=="+sheet.getCell(0,y).getContents();
                                                       // Selektion starten
                                                        try {
                                                                    edpQT1.startQuery(dbgroup, "", selektionT, "nummer,such,id");
                                                             } catch (InvalidQueryException ex) {
                                                        Logger.getLogger(excelimport.class.getName()).log(Level.SEVERE, null, ex);
                                                        }
                                                        // Selektion erfolgreich?
                                                        if (edpQT1.getRecordCount()==1){
                                                         //Datensatz
                                                           edpQT1.getNextRecord();
                                                           // Datensatz eintrgaen über die id
                                                           EKS.formel("M|ydatensatz=\""+edpQT1.getField(3)+"\"");    
                                                        }
                                        }
                                        sessionT.endSession();
                                        
                                     }catch (CantBeginSessionException ex) {
                                             EKS.box("Fehler\n"+ex.getMessage());}
                                    
                                }
                                }
                                 // yimport  gedrückt
                                if (evtvar.equals ("yimport"))
                                {                                
                                         
                                            // EDP Session starten
                                            EDPSession session = EDPFactory.createEDPSession ();
                                            try {
                                                
                                                    session.beginSession(EKS.Mvar("yserver"),yport,EKS.Mvar("ymandant"),EKS.Mvar("ypasswort"), "JEDP_0001");
                                                    EDPQuery edpQ1 = session.createQuery();
                                                    EDPEditor edpE1 = session.createEditor();
                                                    // Evtl Tabelle Löschen
                                                    if (EKS.Mvar("yloetab").equals("ja"))
                                                        {
                                                            Loeschtab(edpQ1,edpE1,sheet,dbgroup);
                                                        }
                                                    // Feldbezeichner abholen
                                                    row = sheet.getRow(1);
                                                    int maxcolumn=row.length+1;
                                                    String [] Felder = new String[row.length];
                                                    // Die Überschriftenzeile Zellenweise durchlaufen
                                                    for ( int x=0; x < row.length; x++)						
                                                    {
                                                        Zelle = sheet.getCell(x,1);
                                                        Zellenstring = Zelle.getContents(); 
                                                        // und in einem Array ablegen
                                                        Felder[x]= Zellenstring;
                                                    } 
                                                    
                                                    // Daten lesen -> Durch alle Zeilen durchlaufen
                                                    for (int y = 2 ; y < sheet.getRows() ; y++)
                                                    {
                                                        errory++; 
                                                        row = sheet.getRow(y);
                                                        int Excelzeile=y+1;
                                                        EKS.hinweis("-SOFORT \"Importiere ZEILE "+y+" "+sheet.getCell(0,y).getContents()+"     -> Erfolgreich "+yok+"      ->Fehler "+yfehler+" \"");
                                                        try {
                                                            for ( int x=0; x < row.length; x++)						
                                                            {
                                                              
                						Zelle = sheet.getCell(x,y);
                                				Zellenstring = Zelle.getContents(); 
                                                		// Wenn erste Spalte angeschaut wird, dann selektion starten
                                                        	if(x==0)
                                                                {
												
                                                                    String selektion=Felder[x]+"=="+Zellenstring;
                                                                    edpQ1.startQuery(dbgroup,"",selektion,"nummer,such,id");
                                                                    if (edpQ1.getRecordCount()==0)
                                                                    {
                                                                        //Neu 
                                                                        edpE1.beginEditNew(db,gruppe);
                                                                        edpE1.setFieldVal(Felder[x], Zellenstring);
                                                                        
								
                                                                    }
                                                                    else
                                                                    {
                                                                        // Ändern
                                                                        edpQ1.getNextRecord();
                                                                        edpE1.beginEdit(edpQ1.getField(3));
                                                                        
                                                                        // Tabellenimport  
                                                                    if (EKS.Mvar("ydatatab").equals("ja"))
                                                                    {
                                                                        if (edpE1.hasTablePart())
                                                                        {//Datensatz besitzt Tabelle -> zeile einfügen
                                                                            edpE1.insertRow("");
                                                                            
                                                                        }
                                                                        else
                                                                        {
                                                                            //Datensatz besitzt keine Tabelle
                                                                           EKS.formel("M|yfehler=Datensatz hat keine Tabelle");
                                                                        }    
                                                                    
                                                                     }
                                                                                
								
                                                                    }	
							
                                                                }
                                                                if (x>0)
                                                                {
                                                                  
                                                                  // Tabellenimport  
                                                                    if (EKS.Mvar("ydatatab").equals("ja"))
                                                                    {
                                                                        if (edpE1.hasTablePart())
                                                                        {
                                                                            //letzte Tabellenzeile beschreiben
                                                                            edpE1.setFieldVal(edpE1.getRowCount(),Felder[x],Zellenstring);     
                                                                        }
                                                                        else
                                                                        {
                                                                            //Datensatz besitzt keine Tabelle
                                                                           EKS.formel("M|yfehler=Datensatz hat keine Tabelle");
                                                                        }    
                                                                    
                                                                     }
                                                                    else
                                                                    // Kopfdaten
                                                                    {
                                                                    edpE1.setFieldVal(Felder[x], Zellenstring);
                                                                    }
                                                                }
                                                               
						
                                                            }
                                                          
                                                        edpE1.endEditSave();
                                       
                                                        yok ++; 
                                                        EKS.formel("M|yok="+yok);
                                                        
                                                        
                                                        errorsheet.removeRow(errory);
                                                        errory --;
                                                        if (ytabelle.equals("ja"))
                                                        {
                                                            EKS.hole("MASKE ZEILE "+(y-1));
                                                            EKS.formel("M|yicon=\"icon:ok\"");
                                                        }
                                                        } catch (Exception e){
                                                            

                                                                    edpE1.endEditCancel();
                                                               
                                                                yfehler ++; 
                                                                EKS.formel("M|yfehler="+yfehler);
                                                                l = new Label(maxcolumn,errory, e.getMessage());
                                                                try {
                                                                errorsheet.addCell(l);
                                                                } catch (WriteException ex) {
                                                                Logger.getLogger(excelimport.class.getName()).log(Level.SEVERE, null, ex);
                           
                                                                }
                                                                
                                                                if (ytabelle.equals("nein"))
                                                                {
                                                                    EKS.mache("MASKE ZEILE +");
                                                                    EKS.formel("M|ytfehler=\""+e.getMessage()+"\"");
                                                                    EKS.formel("M|yicon=\"icon:stop\"");
                                                                }
                                                                else
                                                                {
                                                                    EKS.hole("MASKE ZEILE "+(y-1));
                                                                    EKS.formel("M|ytfehler=\""+e.getMessage()+"\"");
                                                                    EKS.formel("M|yicon=\"icon:stop\"");
                                                                }
                                                                }
                                                }
				
			        
                                            
				//session.commitTransaction();
                                            workbook.close();
                                            errorworkbook.write();
                    try {
                        errorworkbook.close();
                       

                        //ende
                    } catch (WriteException ex) {
                        Logger.getLogger(excelimport.class.getName()).log(Level.SEVERE, null, ex);
                    }
                                //ende
                                session.endSession();          
				
                                            } catch (CantBeginSessionException ex) {
                                             EKS.box("Fehler\n"+ex.getMessage());
                                            
                                            
                                                
                                            }
                                            
                                }       
                               } catch (IOException ex) {
                                          //String x =  EKS.Mvar("ydatafile");
                                            EKS.box("Fehler\n"+ex.getMessage());
                                            
              
                                            } catch (BiffException ex) {
                                            EKS.box("Fehler\n"+ex.getMessage());
    
                }   
  
  

       
				



  return 0;
}

   

    private void Loeschtab(EDPQuery edpQ1, EDPEditor edpE1, Sheet sheet,String dbgroup) {
   //     throw new UnsupportedOperationException("Not yet implemented");
     String selfield=sheet.getCell(0,1).getContents();
     for (int y = 2 ; y < sheet.getRows() ; y++)
          {
              EKS.hinweis("-SOFORT \"Lösche Tabelle ZEILE "+y+" "+sheet.getCell(0,y).getContents()+"\"");
              // Selektion aufbauen
              String selektionT=selfield+"=="+sheet.getCell(0,y).getContents();
              // Selektion starten
              try {
                     edpQ1.startQuery(dbgroup, "", selektionT, "nummer,such,id");
                  } catch (InvalidQueryException ex) 
                    {
                    Logger.getLogger(excelimport.class.getName()).log(Level.SEVERE, null, ex);
                    }
                 // Selektion erfolgreich?
                 if (edpQ1.getRecordCount()==1)
                    {
                        //Datensatz
                        edpQ1.getNextRecord();
                try {
                    // Datensatz editieren
                    edpE1.beginEdit(edpQ1.getField(3));
                } catch (CantBeginEditException ex) {
                    Logger.getLogger(excelimport.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    //Tabelle löschen
                    edpE1.deleteAllRows();
                } catch (InvalidRowOperationException ex) {
                    Logger.getLogger(excelimport.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    edpE1.endEditSave();
                } catch (CantSaveException ex) {
                    Logger.getLogger(excelimport.class.getName()).log(Level.SEVERE, null, ex);
                }
                         
                    }
           }    
    }


}
