Seite 1 von 1

Mitgliederauswertung - Zusatzfelder

Verfasst: Dienstag 19. April 2011, 10:44
von screen
Hallo.
Wenn ich eine Mitglieder-Liste per "Auswertung Mitgliedsdaten" ausgeben möchte, wie funktioniert dann die Zusatzfelder-Filterfunktion?
Ich hatte ein Zusatzfeld Mitgliedsschaftstatus angelegt, in dem entweder "aktiv" oder "beendet" steht.
Wenn ich im Zusatzfelder-Bedingungen Dialog nun entweder "aktiv" oder "beendet" eintrage und auf "starten" drücke, bricht er mit folgendem Log ab:

Code: Alles auswählen

error while executing sql statement
org.h2.jdbc.JdbcSQLException: Feld "A.FELDDEFINTION" nicht gefunden
Column "A.FELDDEFINTION" not found; SQL statement:
select distinct mitglied.* from mitglied join zusatzfelder a on a.mitglied = mitglied.id  and a.FELD = ? and a.felddefintion = ? where adresstyp = 1 ORDER BY name, vorname [42122-145]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
	at org.h2.message.DbException.get(DbException.java:167)
	at org.h2.message.DbException.get(DbException.java:144)
	at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:126)
	at org.h2.expression.Comparison.optimize(Comparison.java:154)
	at org.h2.expression.ConditionAndOr.optimize(ConditionAndOr.java:127)
	at org.h2.expression.ConditionAndOr.optimize(ConditionAndOr.java:127)
	at org.h2.command.dml.Select.prepare(Select.java:776)
	at org.h2.command.Parser.prepare(Parser.java:201)
	at org.h2.command.Parser.prepareCommand(Parser.java:213)
	at org.h2.engine.Session.prepareLocal(Session.java:423)
	at org.h2.engine.Session.prepareCommand(Session.java:373)
	at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1056)
	at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71)
	at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:233)
	at de.willuhn.datasource.db.DBServiceImpl.execute(DBServiceImpl.java:446)
	at de.jost_net.JVerein.Queries.MitgliedQuery.get(MitgliedQuery.java:476)
	at de.jost_net.JVerein.Queries.MitgliedQuery.get(MitgliedQuery.java:126)
	at de.jost_net.JVerein.gui.control.MitgliedControl.starteAuswertung(MitgliedControl.java:2750)
	at de.jost_net.JVerein.gui.control.MitgliedControl.access$25(MitgliedControl.java:2746)
	at de.jost_net.JVerein.gui.control.MitgliedControl$25.handleAction(MitgliedControl.java:2164)
	at de.willuhn.jameica.gui.parts.Button$1$1.run(Button.java:152)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(Unknown Source)
	at de.willuhn.jameica.gui.GUI$5.run(GUI.java:787)
	at org.eclipse.swt.widgets.Synchronizer.syncExec(Unknown Source)
	at org.eclipse.swt.widgets.Display.syncExec(Unknown Source)
	at de.willuhn.jameica.gui.GUI.startSync(GUI.java:783)
	at de.willuhn.jameica.gui.parts.Button$1.widgetSelected(Button.java:146)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
	at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
	at de.willuhn.jameica.gui.GUI.loop(GUI.java:804)
	at de.willuhn.jameica.gui.GUI.init(GUI.java:293)
	at de.willuhn.jameica.system.Application.init(Application.java:143)
	at de.willuhn.jameica.system.Application.newInstance(Application.java:85)
	at de.willuhn.jameica.Main.main(Main.java:78)
Jetzt mal vom Sinn oder Unsinn eines solchen Feldes im Speziellen abgesehen: Wie benutzt man diesen Filter denn generell? Reicht es wenn ich einen Begriff eingebe, oder muss ich kompliziertere Syntax wie !=, = o.ä. benutzen?

Re: Mitgliederauswertung - Zusatzfelder

Verfasst: Dienstag 19. April 2011, 18:51
von heiner
Du musst nur den Begriff eingeben. Bei der Programmierung ist mir bei Zeichenfolge-Zusatzfeldern ein "i" in "Felddefinition" verloren gegangen. In der nächsten Entwicklerversion ist es wieder drin.

Heiner

Re: Mitgliederauswertung - Zusatzfelder

Verfasst: Mittwoch 20. April 2011, 10:01
von Danzelot
Hallo Heiner,

hierzu hätte ich noch einen Wunsch.
Zusatzfelder, die als Zeichenfolge deklariert sind, sollten über LIKE abgefragt werden, sonst muss der eingegebene Text vollständig übereinstimmen.
Ich habe das mal getestet, dabei sind folgende Änderungen vorzunehmen:

1. ZusatzfelderAuswahlDialog:
Änderung von settings.setAttribute("zusatzfeld." + counter + ".cond", "=") auf settings.setAttribute("zusatzfeld." + counter + ".cond", "LIKE"). So wird die Filterbedingung in MitgliedControl.properties gespeichert.

Code: Alles auswählen

  @Override
  protected void paint(Composite parent) throws RemoteException
  {
    LabelGroup group = new LabelGroup(parent, JVereinPlugin.getI18n().tr(
        "Bedingungen"), false);
    felder = new ArrayList<Input>();

    DBIterator it = Einstellungen.getDBService().createList(
        Felddefinition.class);
    int counter = 0;
    while (it.hasNext())
    {
      Felddefinition fd = (Felddefinition) it.next();
      switch (fd.getDatentyp())
      {
        case Datentyp.ZEICHENFOLGE:
        {
          TextInput input = new TextInput("", fd.getLaenge());
          input.setName(fd.getLabel());
          felder.add(input);
          group.addInput(input);
          counter++;
          settings
              .setAttribute("zusatzfeld." + counter + ".name", fd.getName());
          settings.setAttribute("zusatzfeld." + counter + ".cond", "LIKE");
          settings.setAttribute("zusatzfeld." + counter + ".datentyp",
              fd.getDatentyp());
          settings.setAttribute("zusatzfeld." + counter + ".definition",
              fd.getID());
          input.setValue(settings.getString("zusatzfeld." + counter + ".value",
              ""));
          break;
        }
       ....
2. MitgliedQuery:
Änderung von bedingungen.add(value) auf bedingungen.add(value + "%"), damit alle Datensätze gefunden werden, bei denen das Zusatzfeld mit dem Wert aus value beginnt. Zusätzlich habe ich über lower(...) dafür gesorgt, dass die Abfrage nun unabhängig von Groß- und Kleinschreibung ist.

Code: Alles auswählen

  public ArrayList<?> get(final String anfangsbuchstabe, final int adresstyp)
      throws RemoteException
  {
    final DBService service = Einstellungen.getDBService();
    final ArrayList<Object> bedingungen = new ArrayList<Object>();

    this.sql = "select distinct mitglied.* ";
    final String sort = (String) this.control.getSortierung().getValue();
    if (sort.equals(JVereinPlugin.getI18n().tr("Geburtstagsliste")))
    {
      this.sql += ", month(geburtsdatum), day(geburtsdatum) ";
    }
    this.sql += "from mitglied ";
    final Settings settings = this.control.getSettings();
    char synonym = 'a';
    if (settings.getInt("zusatzfelder.selected", 0) > 0)
    {
      for (int i = 1; i <= settings.getInt("zusatzfelder.counter", 0); i++)
      {
        final int definition = settings.getInt("zusatzfeld." + i + ".definition", -1);
        switch (settings.getInt("zusatzfeld." + i + ".datentyp", -1))
        {
          case Datentyp.ZEICHENFOLGE:
          {
            final String value = settings.getString("zusatzfeld." + i + ".value",
                null);
            final String cond = settings.getString("zusatzfeld." + i + ".cond", null);

            if (value != null && value.length() > 0)
            {
              this.sql += "join zusatzfelder " + synonym + " on " + synonym
                  + ".mitglied = mitglied.id  and lower(" + synonym + ".FELD) " + cond
                  + " lower( ? ) and " + synonym + ".felddefinition = ? ";
              synonym++;
              bedingungen.add(value + "%");
              bedingungen.add(definition);
            }
            break;
          }
          ....
Vielleicht kannst Du diese Änderungen in den nächsten Build übernehmen.

Gruß
Danzelot

Re: Mitgliederauswertung - Zusatzfelder

Verfasst: Mittwoch 20. April 2011, 21:45
von heiner
Hallo Danzelot,

vielen Dank für deine Anregung. Ich habe sie leicht verändert übernommen. In das Abfragefeld können '%' oder "*" als Joker eingetragen werden. Sofern keine Joker eingetragen wird analog zu "=" gesucht.

Heiner