GeomarketingForum.com
September 05, 2010, 10:29:50 *
Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?

Einloggen mit Benutzername, Passwort und Sitzungslänge
News: Jetzt beim GeoMarketingforum.com registrieren ...
Denn nur wer mitmacht, ist "eigentlich" INFORMIERT !
 
   Übersicht   Hilfe Suche Kalender Login Registrieren  
Seiten: [1] 2
  Drucken  
Autor Thema: Namensfelder und die Funktionen für das DatenImport  (Gelesen 3668 mal)
student-uni
Newbie
*
Beiträge: 19


Profil anzeigen
« am: November 23, 2007, 01:16:18 »

Hab gesehen, es gibt die Möglichkeit eigene Daten Hizufügen und sogar mit existierende Tabelle verknüpfen.
Wie man das Programmarically machen kann ? Welche Namensfelder, Objecte, Functionen sollte ich aufrufen ?

(z.B. Es gibt schon in RG die Tabelle mit Postleitzahlen, ich möchte aber jedem Postleitzahl Anzahl der Bewohner aus meiner Tabelle zuweisen.
je nach PLZ)
Über Regiograpf geht es, - über Import Assistent
ich wollte aber das gleiche im C# Code  realisieren

Danke
« Letzte Änderung: November 23, 2007, 01:20:11 von student-uni » Gespeichert
paff
Administrator
Hero Member
*****
Beiträge: 820


439627146
Profil anzeigen WWW
« Antwort #1 am: November 23, 2007, 05:16:36 »

Einfach mal die Beispielprogramme durchschauen. Da ist ein Excelimport dabei
Gespeichert

Follow RegioGraph on Twitter
http://twitter.com/regiograph
egi
Newbie
*
Beiträge: 22


Profil anzeigen
« Antwort #2 am: Februar 21, 2008, 09:17:56 »

ehrlich gesagt ist da kein direkter excel import, weil keine daten aus einem excelsheet ausgelesen, sondern zufallswerte erzeugt und in die layertabellen eingetragen werden. naja ... ich probier nochmal ein wenig rum bevor ich mich nochmal melde. muesste naemlich genau das tun... daten aus einem excel sheet importieren.
Gespeichert
paff
Administrator
Hero Member
*****
Beiträge: 820


439627146
Profil anzeigen WWW
« Antwort #3 am: Februar 21, 2008, 12:57:07 »

ehrlich gesagt ist da kein direkter excel import, weil keine daten aus einem excelsheet ausgelesen, sondern zufallswerte erzeugt und in die layertabellen eingetragen werden. naja ... ich probier nochmal ein wenig rum bevor ich mich nochmal melde. muesste naemlich genau das tun... daten aus einem excel sheet importieren.

Tut mir leid , den Post verstehe ich nicht Huh
Gespeichert

Follow RegioGraph on Twitter
http://twitter.com/regiograph
AlexP
Newbie
*
Beiträge: 30


Profil anzeigen WWW
« Antwort #4 am: Februar 21, 2008, 02:55:18 »

Moin!

Auf Excel greifst Du über eine OleDBConnection zu.

ConnectionStrings findest Du zum Beispiel unter http://www.carlprothman.net/Default.aspx?tabid=81

Viele Grüße,
Alex
Gespeichert

--
non serviam!
egi
Newbie
*
Beiträge: 22


Profil anzeigen
« Antwort #5 am: März 03, 2008, 05:23:59 »

danke fuer den tip. habs jetzt auch hinbekommen die daten aus ner excelsheet in ein DataSet objekt einzulesen und das ganze auch in die console wieder auszugeben.
leider klappt der import in die layer tabelle noch nicht.

hab mich zunaechst ein wenig mit dem importadapter rumgeschlagen wobei ich fand dass der viel zu umfangreich ist fuer mein vorhaben, und eingaben benoetigt die fuer mich zunaechst gar nicht relevant sind. wollte einfach nur ganz primitiv alle daten rueberschaffen. also hab ichs mit der layer.SetValue( , , ); versucht. klappt allerdings auch nicht. es kommt zwar keine fehlermeldung .. aber die daten sind nicht drueben.

mein code dafuer sieht so aus:
Code:
myLayer1.InsertColumn("Name",LayerColumnType.String,0,30);
myLayer1.InsertColumn("PLZ",LayerColumnType.Integer,1,0);
ImportData(myLayer1,@"..\data\myExcelDataSheet.xls");

die importData fkt:
Code:
public static void ImportData(Layer layer,string excelFileName){

bool closeLayer = false;
if (!layer.IsLocalOpen){
  layer.Project.LoadResource(layer);
  closeLayer = true;
}

DataSet cDataSet=GetExcelData(excelFileName);
         
layer.Columns[0].Length=cDataSet.Tables[0].Rows.Count;
layer.Columns[1].Length=cDataSet.Tables[0].Rows.Count;
               
for(int cRowIndex=0;cRowIndex<cDataSet.Tables[0].Rows.Count;cRowIndex++) {
  for(int cColumnIndex=0;cColumnIndex<cDataSet.Tables[0].Columns.Count;cColumnIndex++) {                                                          layer.SetValue(cRowIndex,cColumnIndex,cDataSet.Tables[0].Rows[cRowIndex].ItemArray[cColumnIndex]);
  }
}

if (closeLayer) {
  layer.Save();
  layer.Project.CloseResource(layer);
}

wenn ich es auf diese weise vergessen kann und den importadapter benutzen sollte sagt es mir.
allerdings hat es mit dem auch nicht geklappt. aber mit dem problem komm ich dann schon wenn es keine alternative gibt Wink
Gespeichert
Peter
Full Member
***
Beiträge: 120


Profil anzeigen
« Antwort #6 am: März 03, 2008, 07:17:29 »

@egi
Ich würde den Importadapter nehmen

Beim Import von "Hand"
Probiere einfach mal nur ein "Datum" zu ändern. Wenn du das richtig hast,
kommta alles andere dann von selber.
Gespeichert
AlexP
Newbie
*
Beiträge: 30


Profil anzeigen WWW
« Antwort #7 am: März 04, 2008, 11:35:06 »

Moin!

Zuerst einmal setzt Column.Length die maximale Anzahl der Zeichen, die für einen Eintrag erlaugt sind. Es ist _NICHT_ die Anzahl der Einträge in einer Tabelle gemeint.

Kann es sein, Du versuchst, einen neuen Punktelayer zu erzeugen?

Sonst sollte Dein Code die Werte setzen, wenn die Excel-Tabelle, die Du importierst, genauso aussieht wie der Ziellayer.

Cheers,
Alex
« Letzte Änderung: März 04, 2008, 11:42:40 von AlexP » Gespeichert

--
non serviam!
egi
Newbie
*
Beiträge: 22


Profil anzeigen
« Antwort #8 am: März 04, 2008, 01:32:49 »

jop so ist es .. ich habe einen frischen layer denn ich nun mit dem excelsheet fuellen moechte, und das mit der column.length thx *G*
ich dachte mir dass die zellen in der tabelle erst erzeugt werden muessten, weil in district alles grau unterlegt ist wenn ich eine frische layertabelle oeffne.
deshalb das:
Code:
layer.Columns[0].Length=cDataSet.Tables[0].Rows.Count;
was natuerlich totaler quatsch ist

« Letzte Änderung: März 04, 2008, 01:47:16 von egi » Gespeichert
AlexP
Newbie
*
Beiträge: 30


Profil anzeigen WWW
« Antwort #9 am: März 04, 2008, 02:41:59 »

Moin!

Du solltest den Code verwenden, der im Beispielprojekt beim Geokodieren verwendet wird. Dabei wird dann gleich der benötigte Platz in der Projektdatei angelegt. Ich würde bei mehr als nur ein paar Datensätzen immer den Layoutgenerator verwenden, da sich der gleich um die richtige Konvertierung der Objekte kümmert und wesentlich schneller läuft als das manuelle Setzen der Objekte.

Cheers,
Alex
Gespeichert

--
non serviam!
egi
Newbie
*
Beiträge: 22


Profil anzeigen
« Antwort #10 am: März 04, 2008, 03:08:02 »

danke .. ich schau mir das ganze mal genauer an. bisher hab ich immer nur auf den beispielcode des imports geschielt.
Gespeichert
egi
Newbie
*
Beiträge: 22


Profil anzeigen
« Antwort #11 am: März 05, 2008, 11:21:26 »

in beiden beispielen (import und geocode) werden immer werte zum abgleichen benutzt, vonwegen matchColumn etc.
wenn ich allerdings gar keine habe, oder auch einfach nur ohne auskommen will, wie kann ich dann trotzdem die daten aus m excelsheet 1zu1 in district reinholen?

und noch eine frage:
beim ImportColumnMatching uebergibt man bei den parametern eine targetColumn und eine sourceColumn .... was ist was?
Gespeichert
Peter
Full Member
***
Beiträge: 120


Profil anzeigen
« Antwort #12 am: März 05, 2008, 11:28:00 »

und noch eine frage:
beim ImportColumnMatching uebergibt man bei den parametern eine targetColumn und eine sourceColumn .... was ist was?
Das müssten die Abgleichspalten sein. Eine im Layer und eine in der Excelliste
Gespeichert
egi
Newbie
*
Beiträge: 22


Profil anzeigen
« Antwort #13 am: März 05, 2008, 01:14:54 »

wollte ja eigentl. wissen welche nun die excel tabelle ist und welche die district Grin
aber naja .. das laesst sich ja ausprobieren, viel wichtiger ist mir allerdings die frage obs auch ohne geht.

ach und ... um alle probleme zu umgehen.. wie starte ich eigentl. einen aufgezeichneten import?

oh hey ... wow, ich seh grad dass diese .imp files in xml geschrieben sind und dort alle daten drinstehen die ich fuer den importadapter brauche xD
mal sehn obs nun klappt

@alexP: wo is n dieser layoutgenerator? ich find den nirgends in der api.chm

.... so update: nach mehreren gescheiterten versuchen geb ich fuer heute auf, naja morgen ist auch noch ein tag.
nachdem ich recht flott die daten aus excel ins dataset und aus dem dataset in die console bekommen hab, hab ich echt nicht gedacht dass ich mich dermassen damit abquaelen wuerde sie in district zu importieren .. puh  Undecided

.... noch ein update: diese beispiele die mitgegeben wurden, fuer den import und die geocodierung...
sollen die eigentl. so wie sie vorliegen funktionieren ?? bei mir tun sie es naemlich nicht ...  Roll Eyes
zumindest nicht so ohne weiteres. ich sehe grad das beide beispiel auf ihre art und weise mit layer.objectcount hantieren. da dieser bei einem neuen layer allerdings 0 betraegt ist es mir nun auch verstaendlich wieso nichts importiert wird.
die beispiele alleine bringen mich also nicht weiter.
gibt es eine moeglichkeit leere zellen zu erzeugen?

... so sieht es bei mir zur zeit aus:
Code:
Layer layerDots=cApplication.Project.NewLayer("dots",LayerType.Point,null);

layerDots.StartTransaction("Geocode data");

cProject.LoadResource(layerDots);

Column columnName=layerDots.InsertColumn("name",LayerColumnType.String,0,0);
Column columnPLZ=layerDots.InsertColumn("plz",LayerColumnType.Integer,1,0);
               
ImportColumnMatching[] columnMatching = new ImportColumnMatching[2];
columnMatching[0] = new ImportColumnMatching(columnName.Name,columnName.Key,"Name",columnName.Type,ColumnImportAction.AddUp,0,false,null);
columnMatching[1] = new ImportColumnMatching(columnPLZ.Name,columnPLZ.Key,"PLZ",columnPLZ.Type,ColumnImportAction.AddUp,1,false,null);

ImportAdapter cImportAdapter=layerDots.CreateImportAdapter();
cImportAdapter.MatchType=LayerImportMatching.Exact;
cImportAdapter.CompareAsText=false;
cImportAdapter.GeocodeMatchLayer=cProject.SearchLayer("Postleitzahlen 5-stellig Deutschland 2006");
cImportAdapter.LayerCompareColumn=new ImportColumnMatching("PLZ 5-stellig","PLZ 5-stellig","",LayerColumnType.Integer,ColumnImportAction.AddUp,0,false,null);
cImportAdapter.ImportColumnMatchings=columnMatching;
cImportAdapter.CountColumnKey = GfK.GeoMarketing.Shared.Constants.InvalidColumnKey;
cImportAdapter.SetObjectCountHint(20);

cImportAdapter.BeginImport();
               
DataSet cDataSet=GetExcelData(@"..\dbdata\excelData.xls");
               
// import and geocode data
for(int cRowIndex=0;cRowIndex<cDataSet.Tables[0].Rows.Count;cRowIndex++){
//for(int cColumnIndex=0;cColumnIndex<cDataSet.Tables[0].Rows[0].ItemArray.Length; cColumnIndex++){
    object matchvalue = cDataSet.Tables[0].Rows[cRowIndex].ItemArray[0];
    object importValue = cDataSet.Tables[0].Rows[cRowIndex].ItemArray[1];
    cImportAdapter.ImportData(matchvalue,new object[] {importValue});
//}
}
               
cImportAdapter.EndImport(false);
               
layerDots.CommitTransaction();

layerDots.Project.CloseResource(layerDots);
und es schmiert zur zeit mit dem fehler ab:

Err_ImportColumnIsNull
« Letzte Änderung: März 07, 2008, 09:55:21 von egi » Gespeichert
AlexP
Newbie
*
Beiträge: 30


Profil anzeigen WWW
« Antwort #14 am: März 07, 2008, 11:43:54 »

Moin!

Sorry, war grad' anderweitig am machen, ich meinte natürlich ImportAdapter, nicht LayoutGenerator. War ein Freud'scher verschreiber... ;o)


Du solltest zuerst einmal ein BeginGeocodeMatch() statt dem BeginImport() machen, wenn Du Geokodieren, also neue Punkte einfügen willst. (Siehe Beispiel!)

Als ObjectCountHint solltest Du die Anzahl der Zeilen in Deinem Dataset übergeben, wenn das nicht immer zwanzig sind.

Eingefügt wird per GeocodeData(...) nicht per ImportData(...).

Das LayerImportResult, dass bei GeocodeData(...) zurückgegeben wird, gibt Dir Infos darüber, ob etwas eingefügt wurde oder nicht.

Nach dem CommitTransaction() fehlt wohl noch ein Save(), sonst schließt Du ohne zu speichern.

Ich hoffe, das hilft.

Cheers,
Alex
Gespeichert

--
non serviam!
Seiten: [1] 2
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2007, Simple Machines LLC Prüfe XHTML 1.0 Prüfe CSS