[gnue-contrib] r285 - in address: forms schema

[email protected]
Newsgroups gmane.comp.cms.gnue.cvs
Message-ID <[email protected]>
Author: johannes
Date: 2008-07-29 03:44:27 -0500 (Tue, 29 Jul 2008)
New Revision: 285

Modified:
   address/forms/address.gfd
   address/schema/schema.gsd
Log:
Neue Flags aufgenommen
Datenexport nur noch f?\195?\188r aktuellen Filter


Modified: address/forms/address.gfd
===================================================================
--- address/forms/address.gfd	2007-11-08 08:09:34 UTC (rev 284)
+++ address/forms/address.gfd	2008-07-29 08:44:27 UTC (rev 285)
@@ -1,782 +1,868 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <form title="Studiokonzept Adressdatenbank">
-  <options>
-    <author>BYTEWISE Software GmbH</author>
-    <version>$Rev$</version>
-    <description>Adressenverwaltung</description>
-  </options>
+ <options>
+   <author>BYTEWISE Software GmbH</author>
+   <version>$Rev$</version>
+   <description>Adressenverwaltung</description>
+ </options>
 
-  <datasource name="dts_company" connection="address" table="company">
-    <sortorder>
-      <sortfield name="name1" descending="N" ignorecase="Y"/>
-    </sortorder>
-  </datasource>
+ <datasource name="dts_company" connection="address" table="company">
+   <sortorder>
+     <sortfield name="name1" descending="N" ignorecase="Y"/>
+   </sortorder>
+ </datasource>
 
-  <datasource name="dts_contact" connection="address" table="contact" master="dts_company" masterlink="id" detaillink="company">
-    <sortorder>
-      <sortfield name="surname" descending="N" ignorecase="Y"/>
-    </sortorder>
-  </datasource>
+ <datasource name="dts_contact" connection="address" table="contact" master="dts_company" masterlink="id" detaillink="company">
+   <sortorder>
+     <sortfield name="surname" descending="N" ignorecase="Y"/>
+   </sortorder>
+ </datasource>
 
-  <datasource name="dts_category" connection="address" table="category" prequery="Y">
-    <sortorder>
-      <sortfield name="text" descending="N" ignorecase="Y"/>
-    </sortorder>
-  </datasource>
+ <datasource name="dts_category" connection="address" table="category" prequery="Y">
+   <sortorder>
+     <sortfield name="text" descending="N" ignorecase="Y"/>
+   </sortorder>
+ </datasource>
 
-  <datasource name="dts_salutation" connection="address" table="salutation" prequery="Y">
-    <sortorder>
-      <sortfield name="text" descending="N" ignorecase="Y"/>
-    </sortorder>
-  </datasource>
+ <datasource name="dts_salutation" connection="address" table="salutation" prequery="Y">
+   <sortorder>
+     <sortfield name="text" descending="N" ignorecase="Y"/>
+   </sortorder>
+ </datasource>
 
-  <datasource name="dts_company_quick" connection="address" table="company" prequery="Y">
-    <sortorder>
-      <sortfield name="matchcode" descending="N" ignorecase="Y"/>
-    </sortorder>
-    <condition>
-      <eq><cfield name="quicksearch"/><cconst value="1"/></eq>
-    </condition>
-  </datasource>
+ <datasource name="dts_company_quick" connection="address" table="company" prequery="Y">
+   <sortorder>
+     <sortfield name="matchcode" descending="N" ignorecase="Y"/>
+   </sortorder>
+   <condition>
+     <eq><cfield name="quicksearch"/><cconst value="1"/></eq>
+   </condition>
+ </datasource>
 
-  <datasource name="dts_csv" connection="address" table="contact left outer join company on contact.company = company.id" primarykey="contact.id">
-    <sortorder>
-      <sortfield name="company.name1" ignorecase="Y"/>
-      <sortfield name="contact.surname" ignorecase="Y"/>
-    </sortorder>
-  </datasource>
+ <datasource name="dts_csv" connection="address" table="contact left outer join company on contact.company = company.id" primarykey="contact.id">
+   <sortorder>
+     <sortfield name="company.name1" ignorecase="Y"/>
+     <sortfield name="contact.surname" ignorecase="Y"/>
+   </sortorder>
+ </datasource>
 
-  <!-- ==================================================================== -->
+ <!-- ==================================================================== -->
 
-  <logic>
-    <block name="blk_company" datasource="dts_company" startup="full">
-      <field name="id"           field="id"         datatype="number" length="8"/>
-      <field name="eMatchcode"   field="matchcode"  datatype="text"   length="25" case="upper"/>
-      <field name="eName1"       field="name1"      datatype="text"   length="64"/>
-      <field name="eName2"       field="name2"      datatype="text"   length="64"/>
-      <field name="eCountry"     field="country"    datatype="text"   length="4"/>
-      <field name="eStreet"      field="street"     datatype="text"   length="64"/>
-      <field name="eCity"        field="city"       datatype="text"   length="32"/>
-      <field name="eZIP"         field="zip"        datatype="text"   length="12"/>
-      <field name="eVAT"         field="vatid"      datatype="text"   length="16"/>
-      <field name="eCRG"         field="compreg"    datatype="text"   length="32"/>
-      <field name="ePhone"       field="phone"      datatype="text"   length="64">
-        <trigger type="POST-CHANGE">
-          if blk_company.ePhone.value is not None:
-              blk_company.ePhonex.value = ''.join([c for c in blk_company.ePhone.value if c in '0123456789'])
-          else:
-              blk_company.ePhonex.value = None
-        </trigger>
-      </field>
-      <field name="ePhonex"      field="phonex"      datatype="text"    length="32"/>
-      <field name="eFax"         field="fax"         datatype="text"    length="32"/>
-      <field name="eWeb"         field="web"         datatype="text"    length="64"/>
-      <field name="eMail"        field="email"       datatype="text"    length="64"/>
-      <field name="eCustomer"    field="customer"    datatype="text"    length="25"/>
-      <field name="eBWCustomer"  field="bwcustomer"  datatype="text"    length="16"/>
-      <field name="eBWSupplier"  field="bwsupplier"  datatype="text"    length="16"/>
-      <field name="eShipment"    field="shipment"    datatype="text"    length="64"/>
-      <field name="eCategory"    field="category"    datatype="text"    length="32" fk_key="id" fk_description="text" fk_source="dts_category"/>
-      <field name="eMemoAvailable"                   datatype="boolean" editable="N"/>
-      <field name="eMemo"        field="memo"        datatype="text"/>
-      <field name="eQuicksearch" field="quicksearch" datatype="boolean"/>
-      <field name="eFilter1"     field="filter1"     datatype="boolean"/>
-      <field name="eFilter2"     field="filter2"     datatype="boolean"/>
-      <field name="eFilter3"     field="filter3"     datatype="boolean"/>
-      <field name="contact_count"                    datatype="number"  length="4"  editable="N"/>
+ <logic>
+   <block name="blk_company" datasource="dts_company" startup="full">
+     <field name="id"           field="id"         datatype="number" length="8"/>
+     <field name="eMatchcode"   field="matchcode"  datatype="text"   length="25" case="upper"/>
+     <field name="eName1"       field="name1"      datatype="text"   length="64"/>
+     <field name="eName2"       field="name2"      datatype="text"   length="64"/>
+     <field name="eCountry"     field="country"    datatype="text"   length="4"/>
+     <field name="eStreet"      field="street"     datatype="text"   length="64"/>
+     <field name="eCity"        field="city"       datatype="text"   length="32"/>
+     <field name="eZIP"         field="zip"        datatype="text"   length="12"/>
+     <field name="eVAT"         field="vatid"      datatype="text"   length="16"/>
+     <field name="eCRG"         field="compreg"    datatype="text"   length="32"/>
+     <field name="ePhone"       field="phone"      datatype="text"   length="64">
+       <trigger type="POST-CHANGE">
+         if blk_company.ePhone.value is not None:
+             blk_company.ePhonex.value = ''.join([c for c in blk_company.ePhone.value if c in '0123456789'])
+         else:
+             blk_company.ePhonex.value = None
+       </trigger>
+     </field>
+     <field name="ePhonex"      field="phonex"      datatype="text"    length="32"/>
+     <field name="eFax"         field="fax"         datatype="text"    length="32"/>
+     <field name="eWeb"         field="web"         datatype="text"    length="64"/>
+     <field name="eMail"        field="email"       datatype="text"    length="64"/>
+     <field name="eCustomer"    field="customer"    datatype="text"    length="25"/>
+     <field name="eBWCustomer"  field="bwcustomer"  datatype="text"    length="16"/>
+     <field name="eBWSupplier"  field="bwsupplier"  datatype="text"    length="16"/>
+     <field name="eShipment"    field="shipment"    datatype="text"    length="64"/>
+     <field name="eCategory"    field="category"    datatype="text"    length="32" fk_key="id" fk_description="text" fk_source="dts_category"/>
+     <field name="eMemoAvailable"                   datatype="boolean" editable="N"/>
+     <field name="eMemo"        field="memo"        datatype="text"/>
+     <field name="eQuicksearch" field="quicksearch" datatype="boolean"/>
+     <field name="eFilter1"     field="filter1"     datatype="boolean"/>
+     <field name="eFilter2"     field="filter2"     datatype="boolean"/>
+     <field name="eFilter3"     field="filter3"     datatype="boolean"/>
+     <field name="contact_count"                    datatype="number"  length="4"  editable="N"/>
 
-      <trigger type="ON-RECORDLOADED">
-        blk_company.eMemoAvailable.value = (blk_company.eMemo.value is not None and len(blk_company.eMemo.value.strip()) > 0)
-      </trigger>
+     <trigger type="ON-RECORDLOADED">
+       blk_company.eMemoAvailable.value = (blk_company.eMemo.value is not None and len(blk_company.eMemo.value.strip()) > 0)
+     </trigger>
 
-      <trigger type="POST-FOCUSIN">
-        blk_company.contact_count.value = blk_contact.get_record_count()
-      </trigger>
+     <trigger type="POST-FOCUSIN">
+       blk_company.contact_count.value = blk_contact.get_record_count()
+     </trigger>
 
-      <trigger type="PRE-DELETE">
-        # TODO: This should be solved using the already existing blocks
-        backend = globals().get('address')
-        if backend is not None:
-            cid = blk_company.id.value
-            cmd = 'DELETE FROM contact WHERE company=%d' % cid
-            backend.sql(cmd);
-      </trigger>
-    </block>
+     <trigger type="PRE-DELETE">
+       # TODO: This should be solved using the already existing blocks
+       backend = globals().get('address')
+       if backend is not None:
+           cid = blk_company.id.value
+           cmd = 'DELETE FROM contact WHERE company=%d' % cid
+           backend.sql(cmd);
+     </trigger>
+   </block>
 
-    <block name="blk_contact" datasource="dts_contact">
-      <field name="id"          field="id"         datatype="number" length="8"/>
-      <field name="eSalutation" field="salutation" datatype="text" length="16" fk_key="id" fk_description="text" fk_source="dts_salutation"/>
-      <field name="eTitle"      field="title"      datatype="text" length="32"/>
-      <field name="eFirstname"  field="firstname"  datatype="text" length="32"/>
-      <field name="eSurname"    field="surname"    datatype="text" length="32"/>
-      <field name="eDepartment" field="department" datatype="text" length="32"/>
-      <field name="eDuty"       field="duty"       datatype="text" length="40"/>
-      <field name="ePhone1"     field="phone1"     datatype="text" length="40">
-        <trigger type="POST-CHANGE">
-          if blk_contact.ePhone1.value is not None:
-              blk_contact.ePhone1x.value = ''.join([c for c in blk_contact.ePhone1.value if c in '0123456789'])
-          else:
-              blk_contact.ePhone1x.value = None
-        </trigger>
-      </field>
-      <field name="ePhone2"     field="phone2"     datatype="text" length="40">
-        <trigger type="POST-CHANGE">
-          if blk_contact.ePhone2.value is not None:
-              blk_contact.ePhone2x.value = ''.join([c for c in blk_contact.ePhone2.value if c in '0123456789'])
-          else:
-              blk_contact.ePhone2x.value = None
-        </trigger>
-      </field>
-      <field name="ePhone1x"    field="phone1x"    datatype="text" length="32"/>
-      <field name="ePhone2x"    field="phone2x"    datatype="text" length="32"/>
-      <field name="eFax"        field="fax"        datatype="text" length="40"/>
-      <field name="eMail"       field="email"      datatype="text" length="64"/>
-      <field name="eMemo"       field="memo"       datatype="text"/>
-      <field name="eMemoAvailable"                 datatype="boolean" editable="N"/>
-      <field name="eFilter1"    field="filter1"    datatype="boolean"/>
-      <field name="eFilter2"    field="filter2"    datatype="boolean"/>
-      <field name="eFilter3"    field="filter3"    datatype="boolean"/>
+   <block name="blk_contact" datasource="dts_contact">
+     <field name="id"          field="id"         datatype="number" length="8"/>
+     <field name="eSalutation" field="salutation" datatype="text" length="16" fk_key="id" fk_description="text" fk_source="dts_salutation"/>
+     <field name="eTitle"      field="title"      datatype="text" length="32"/>
+     <field name="eFirstname"  field="firstname"  datatype="text" length="32"/>
+     <field name="eSurname"    field="surname"    datatype="text" length="32"/>
+     <field name="eDepartment" field="department" datatype="text" length="32"/>
+     <field name="eDuty"       field="duty"       datatype="text" length="40"/>
+     <field name="ePhone1"     field="phone1"     datatype="text" length="40">
+       <trigger type="POST-CHANGE">
+         if blk_contact.ePhone1.value is not None:
+             blk_contact.ePhone1x.value = ''.join([c for c in blk_contact.ePhone1.value if c in '0123456789'])
+         else:
+             blk_contact.ePhone1x.value = None
+       </trigger>
+     </field>
+     <field name="ePhone2"     field="phone2"     datatype="text" length="40">
+       <trigger type="POST-CHANGE">
+         if blk_contact.ePhone2.value is not None:
+             blk_contact.ePhone2x.value = ''.join([c for c in blk_contact.ePhone2.value if c in '0123456789'])
+         else:
+             blk_contact.ePhone2x.value = None
+       </trigger>
+     </field>
+     <field name="ePhone1x"    field="phone1x"    datatype="text" length="32"/>
+     <field name="ePhone2x"    field="phone2x"    datatype="text" length="32"/>
+     <field name="eFax"        field="fax"        datatype="text" length="40"/>
+     <field name="eMail"       field="email"      datatype="text" length="64"/>
+     <field name="eMemo"       field="memo"       datatype="text"/>
+     <field name="eMemoAvailable"                 datatype="boolean" editable="N"/>
+     <field name="eFilter1"    field="filter1"    datatype="boolean"/>
+     <field name="eFilter2"    field="filter2"    datatype="boolean"/>
+     <field name="eFilter3"    field="filter3"    datatype="boolean"/>
 
-      <trigger type="ON-RECORDLOADED">
-        blk_contact.eMemoAvailable.value = (blk_contact.eMemo.value is not None and len(blk_contact.eMemo.value.strip()) > 0)
-      </trigger>
+     <field name="eCorp_film"  field="corp_film"  datatype="boolean" />
+     <field name="eEvent"      field="event"      datatype="boolean" />
+     <field name="eWerbung"    field="werbung"    datatype="boolean" />
+     <field name="ePproduct"   field="pproduct"   datatype="boolean" />
+     <field name="eAdaptionen" field="adaptionen" datatype="boolean" />
+     <field name="eVermietung" field="vermietung" datatype="boolean" />
+     <field name="eTV"         field="tv"         datatype="boolean" />
+     <field name="eReserve"    field="reserve"    datatype="boolean" />
 
-      <trigger type="POST-FOCUSIN">
-        blk_company.contact_count.value = blk_contact.get_record_count()
-      </trigger>
-    </block>
+     <trigger type="ON-RECORDLOADED">
+       blk_contact.eMemoAvailable.value = (blk_contact.eMemo.value is not None and len(blk_contact.eMemo.value.strip()) > 0)
+     </trigger>
 
-    <block name="blk">
-      <field name="company" datatype="text" length="16" required="Y"
-        fk_key="id" fk_description="matchcode" fk_source="dts_company_quick">
-        <trigger type="POST-CHANGE">
-          if blk.company.value is not None:
-              blk_company.search_record(id=int(blk.company.get()))
-          blk_company.contact_count.value = blk_contact.get_record_count()
-        </trigger>
-        <trigger type="POST-FOCUSOUT">
-          # Reset value so the cursor disappears.
-          blk.company.value = None
-        </trigger>
-      </field>
-    </block>
+     <trigger type="POST-FOCUSIN">
+       blk_company.contact_count.value = blk_contact.get_record_count()
+     </trigger>
+   </block>
 
-    <block name="blk_csv" datasource="dts_csv">
-      <field name="FA/Firma1" field="company.name1"/>
-      <field name="FA/Firma2" field="company.name2"/>
-      <field name="FA/Straße" field="company.street"/>
-      <field name="FA/PLZ" field="company.zip"/>
-      <field name="FA/Ort" field="company.city"/>
-      <field name="FA/Telefon" field="company.phone"/>
-      <field name="FA/Kategorie" field="company.category"/>
-      <field name="FA/Filter1" field="company.filter1"/>
-      <field name="FA/Filter2" field="company.filter2"/>
-      <field name="FA/Filter3" field="company.filter3"/>
-      <field name="ASP/Anrede" field="contact.salutation" fk_key="id" fk_description="text" fk_source="dts_salutation"/>
-      <field name="ASP/Titel" field="contact.title"/>
-      <field name="ASP/Vorname" field="contact.firstname"/>
-      <field name="ASP/Nachname" field="contact.surname"/>
-      <field name="ASP/Abteilung" field="contact.department"/>
-      <field name="ASP/Funktion" field="contact.duty"/>
-      <field name="ASP/Telefon" field="contact.phone1"/>
-      <field name="ASP/Mobil" field="contact.phone2"/>
-      <field name="ASP/Filter1" field="contact.filter1"/>
-      <field name="ASP/Filter2" field="contact.filter2"/>
-      <field name="ASP/Filter3" field="contact.filter3"/>
-    </block>
-  </logic>
+   <block name="blk">
+     <field name="company" datatype="text" length="16" required="Y"
+       fk_key="id" fk_description="matchcode" fk_source="dts_company_quick">
+       <trigger type="POST-CHANGE">
+         if blk.company.value is not None:
+             blk_company.search_record(id=int(blk.company.get()))
+         blk_company.contact_count.value = blk_contact.get_record_count()
+       </trigger>
+       <trigger type="POST-FOCUSOUT">
+         # Reset value so the cursor disappears.
+         blk.company.value = None
+       </trigger>
+     </field>
+   </block>
 
-  <!-- ==================================================================== -->
+   <block name="blk_csv" datasource="dts_csv">
+     <field name="FID" field="company.id" />
+     <field name="FA/Firma1" field="company.name1"/>
+     <field name="FA/Firma2" field="company.name2"/>
+     <field name="FA/Straße" field="company.street"/>
+     <field name="FA/PLZ" field="company.zip"/>
+     <field name="FA/Ort" field="company.city"/>
+     <field name="FA/Telefon" field="company.phone"/>
+     <field name="FA/Kategorie" field="company.category"/>
+     <field name="FA/Filter1" field="company.filter1"/>
+     <field name="FA/Filter2" field="company.filter2"/>
+     <field name="FA/Filter3" field="company.filter3"/>
+     <field name="ASP/Anrede" field="contact.salutation" fk_key="id" fk_description="text" fk_source="dts_salutation"/>
+     <field name="ASP/Titel" field="contact.title"/>
+     <field name="ASP/Vorname" field="contact.firstname"/>
+     <field name="ASP/Nachname" field="contact.surname"/>
+     <field name="ASP/Abteilung" field="contact.department"/>
+     <field name="ASP/Funktion" field="contact.duty"/>
+     <field name="ASP/Telefon" field="contact.phone1"/>
+     <field name="ASP/Mobil" field="contact.phone2"/>
+     <field name="ASP/EMail" field="contact.email"/>
+     <field name="ASP/Filter1" field="contact.filter1"/>
+     <field name="ASP/Filter2" field="contact.filter2"/>
+     <field name="ASP/Filter3" field="contact.filter3"/>
+   </block>
+ </logic>
 
-  <layout tabbed="none">
-    <page name="pg">
-      <hbox>
-        <vbox>
-          <hbox block="blk_company" label="Firmen">
-            <vbox>
-              <hbox label="Match:">
-                <entry field="eMatchcode"/>
-                <button action="act_search_company" label="Suche"/>
-              </hbox>
-              <entry field="eName1"         label="Firma-1:"/>
-              <entry field="eName2"         label="Firma-2:"/>
-              <entry field="eStreet"        label="Straße:"/>
-              <entry field="eZIP"           label="PLZ:"/>
-              <entry field="eCity"          label="Ort:"/>
-              <entry field="eCountry"       label="Land:"/>
-              <entry field="eVAT"           label="UID:"/>
-              <entry field="eCRG"           label="FNr:"/>
-              <entry field="eQuicksearch" label="Schnellaufruf"/>
-              <hbox label="Memo:">
-                <entry field="eMemoAvailable"     label="verfügbar"/>
-                <button action="act_memo_company" label="Bearbeiten"/>
-              </hbox>
-            </vbox>
+ <!-- ==================================================================== -->
 
-            <vbox>
-              <entry field="ePhone"       label="Tel.allg.:"/>
-              <entry field="eFax"         label="Fax allg.:"/>
-              <entry field="eWeb"         label="Internet:"/>
-              <entry field="eMail"        label="E-Mail:"/>
-              <entry field="eCustomer"    label="unsere KdNr:"/>
-              <entry field="eBWCustomer"  label="BW KdNr:"/>
-              <entry field="eBWSupplier"  label="BW LiNr:"/>
-              <entry field="eShipment"    label="Versandart:"/>
-              <entry field="eCategory"    label="Kategorie:"/>
-              <entry field="eFilter1"     label="Filter-1"/>
-              <entry field="eFilter2"     label="Filter-2"/>
-              <entry field="eFilter3"     label="Filter-3"/>
-            </vbox>
-          </hbox>
+ <layout tabbed="none">
+   <page name="pg">
+     <hbox>
+       <vbox>
+         <hbox block="blk_company" label="Firmen">
+           <vbox>
+             <hbox label="Match:">
+               <entry field="eMatchcode"/>
+               <button action="act_search_company" label="Suche"/>
+             </hbox>
+             <entry field="eName1"         label="Firma-1:"/>
+             <entry field="eName2"         label="Firma-2:"/>
+             <entry field="eStreet"        label="Straße:"/>
+             <entry field="eZIP"           label="PLZ:"/>
+             <entry field="eCity"          label="Ort:"/>
+             <entry field="eCountry"       label="Land:"/>
+             <entry field="eVAT"           label="UID:"/>
+             <entry field="eCRG"           label="FNr:"/>
+             <button action="to_clipboard" label="In Zwischenablage kopieren"/>
+             <entry field="eQuicksearch" label="Schnellaufruf"/>
+             <hbox label="Memo:">
+               <entry field="eMemoAvailable"     label="verfügbar"/>
+               <button action="act_memo_company" label="Bearbeiten"/>
+             </hbox>
+           </vbox>
 
-          <vbox block="blk_contact" label="Ansprechpersonen">
-            <hbox>
-              <vbox>
-                <hbox label="Anrede:">
-                  <entry field="eSalutation"/>
-                  <button action="act_search_contact" label="Suche"/>
-                </hbox>
-                <entry field="eTitle"      label="Titel:"/>
-                <entry field="eFirstname"  label="Vorname:"/>
-                <entry field="eSurname"    label="Nachname:"/>
-                <entry field="eDepartment" label="Abteilung:"/>
-                <entry field="eDuty"       label="Funktion:"/>
-                <hbox label="Memo:">
-                  <entry field="eMemoAvailable" label="verfügbar"/>
-                  <button action="act_memo_contact" label="Bearbeiten"/>
-                </hbox>
-              </vbox>
+           <vbox>
+             <entry field="ePhone"       label="Tel.allg.:"/>
+             <entry field="eFax"         label="Fax allg.:"/>
+             <entry field="eWeb"         label="Internet:"/>
+             <entry field="eMail"        label="E-Mail:"/>
+             <entry field="eCustomer"    label="unsere KdNr:"/>
+             <entry field="eBWCustomer"  label="BW KdNr:"/>
+             <entry field="eBWSupplier"  label="BW LiNr:"/>
+             <entry field="eShipment"    label="Versandart:"/>
+             <entry field="eCategory"    label="Kategorie:"/>
+             <entry field="eFilter1"     label="SKMT Kunde"/>
+             <entry field="eFilter2"     label="DMG Kunde"/>
+             <entry field="eFilter3"     label="DMG Interessent"/>
+           </vbox>
+         </hbox>
 
-              <vbox>
-                <entry field="ePhone1"        label="Telefon:"/>
-                <entry field="ePhone2"        label="Mobil:"/>
-                <entry field="eFax"           label="Fax:"/>
-                <entry field="eMail"          label="E-Mail:"/>
-                <entry field="eFilter1"       label="Filter-1"/>
-                <entry field="eFilter2"       label="Filter-2"/>
-                <entry field="eFilter3"       label="Filter-3"/>
-              </vbox>
-            </hbox>
-            <hbox>
-              <button label="&lt;&lt;">
-                <trigger type="ON-ACTION">blk_contact.first_record()</trigger>
-              </button>
-              <button label="&lt;">
-                <trigger type="ON-ACTION">blk_contact.prev_record()</trigger>
-              </button>
-              <button label="&gt;">
-                <trigger type="ON-ACTION">blk_contact.next_record()</trigger>
-              </button>
-              <button label="&gt;&gt;">
-                <trigger type="ON-ACTION">blk_contact.last_record()</trigger>
-              </button>
-              <entry block="blk_company" field="contact_count"/>
-            </hbox>
-          </vbox>
-        </vbox>
-        <vbox>
-          <hbox>
-            <entry block="blk" field="company" label="Schnellaufruf:" style="listbox"/>
-          </hbox>
-          <button action="act_search_phone" label="Telefonnummernsuche"/>
-          <button action="act_export" label="Datenexport"/>
-        </vbox>
-      </hbox>
-    </page>
-  </layout>
+         <vbox block="blk_contact" label="Ansprechpersonen">
+           <hbox>
+             <vbox>
+               <hbox label="Anrede:">
+                 <entry field="eSalutation"/>
+                 <button action="act_search_contact" label="Suche"/>
+               </hbox>
+               <entry field="eTitle"      label="Titel:"/>
+               <entry field="eFirstname"  label="Vorname:"/>
+               <entry field="eSurname"    label="Nachname:"/>
+               <entry field="eDepartment" label="Abteilung:"/>
+               <entry field="eDuty"       label="Funktion:"/>
+               <hbox label="Memo:">
+                 <entry field="eMemoAvailable" label="verfügbar"/>
+                 <button action="act_memo_contact" label="Bearbeiten"/>
+               </hbox>
+             </vbox>
 
-  <!-- ==================================================================== -->
+             <vbox>
+               <entry field="ePhone1"        label="Telefon:"/>
+               <entry field="ePhone2"        label="Mobil:"/>
+               <entry field="eFax"           label="Fax:"/>
+               <entry field="eMail"          label="E-Mail:"/>
+               <hbox>
+                 <vbox label="SKMT">
+                   <entry field="eFilter1"       label="SKMT-Temp"/>
+                   <entry field="eFilter2"       label="SKMT-Mailing"/>
+                   <entry field="eFilter3"       label="SKMT-dScope"/>
+                 </vbox>
+                 <hbox label="DMG">
+                 <vbox>
+                   <entry field="eCorp_film"     label="Corporate Film"/>
+                   <entry field="eEvent"         label="Event"/>
+                   <entry field="eWerbung"       label="Werbung"/>
+                   <entry field="ePproduct"      label="Post Production"/>
+                 </vbox>
+                 <vbox>
+                   <entry field="eAdaptionen"    label="Adaption"/>
+                   <entry field="eVermietung"    label="Vermietung"/>
+                   <entry field="eTV"            label="TV"/>
+                   <entry field="eReserve"       label="Reserve"/>
+                 </vbox>
+                 </hbox>
+               </hbox>
+             </vbox>
+           </hbox>
+           <hbox>
+             <button label="&lt;&lt;">
+               <trigger type="ON-ACTION">blk_contact.first_record()</trigger>
+             </button>
+             <button label="&lt;">
+               <trigger type="ON-ACTION">blk_contact.prev_record()</trigger>
+             </button>
+             <button label="&gt;">
+               <trigger type="ON-ACTION">blk_contact.next_record()</trigger>
+             </button>
+             <button label="&gt;&gt;">
+               <trigger type="ON-ACTION">blk_contact.last_record()</trigger>
+             </button>
+             <entry block="blk_company" field="contact_count"/>
+           </hbox>
+         </vbox>
+       </vbox>
+       <vbox>
+         <hbox>
+           <entry block="blk" field="company" label="Schnellaufruf:" style="listbox"/>
+         </hbox>
+         <button action="act_search_phone" label="Telefonnummernsuche"/>
+         <button action="act_export" label="Datenexport"/>
+       </vbox>
+     </hbox>
+   </page>
+ </layout>
 
-  <action name="act_search_company">
-    params = {}
-    activateDialog('dlg_search_company', params, True)
-    if params.has_key('prm_result') and params['prm_result'] is not None:
-        blk_company.search_record(id=params['prm_result'])
-  </action>
+ <!-- ==================================================================== -->
 
-  <action name="act_search_contact">
-    params = {}
-    activateDialog('dlg_search_contact', params, True)
-    if params.has_key('prm_company') and params['prm_company'] is not None:
-        blk_company.search_record(id=params['prm_company'])
-        blk_contact.search_record(id=params['prm_contact'])
-  </action>
+ <action name="act_search_company">
+   params = {}
+   activateDialog('dlg_search_company', params, True)
+   if params.has_key('prm_result') and params['prm_result'] is not None:
+       blk_company.search_record(id=params['prm_result'])
+ </action>
 
-  <action name="act_search_phone">
-    params = {}
-    activateDialog('dlg_search_phone', params, True)
-    if params.has_key('prm_company') and params['prm_company'] is not None:
-        blk_company.search_record(id=params['prm_company'])
-        blk_contact.search_record(id=params['prm_contact'])
-    blk_company.contact_count.value = blk_contact.get_record_count()
-  </action>
+ <action name="act_search_contact">
+   params = {}
+   activateDialog('dlg_search_contact', params, True)
+   if params.has_key('prm_company') and params['prm_company'] is not None:
+       blk_company.search_record(id=params['prm_company'])
+       blk_contact.search_record(id=params['prm_contact'])
+ </action>
 
-  <action name="act_memo_company">
-    params = {'prm_memo': blk_company.eMemo.value}
-    activateDialog('dlg_memo', params, True)
-    if params.get('prm_mres'):
-        value = params['prm_memo']
-        blk_company.eMemo.value = value
-        blk_company.eMemoAvailable.value = bool(value)
-  </action>
+ <action name="act_search_phone">
+   params = {}
+   activateDialog('dlg_search_phone', params, True)
+   if params.has_key('prm_company') and params['prm_company'] is not None:
+       blk_company.search_record(id=params['prm_company'])
+       blk_contact.search_record(id=params['prm_contact'])
+   blk_company.contact_count.value = blk_contact.get_record_count()
+ </action>
 
-  <action name="act_memo_contact">
-    params = {'prm_memo': blk_contact.eMemo.value}
-    activateDialog('dlg_memo', params, True)
-    if params.get('prm_mres'):
-        value = params['prm_memo']
-        blk_contact.eMemo.value = value
-        blk_contact.eMemoAvailable.value = bool(value)
-  </action>
+ <action name="act_memo_company">
+   params = {'prm_memo': blk_company.eMemo.value}
+   activateDialog('dlg_memo', params, True)
+   if params.get('prm_mres'):
+       value = params['prm_memo']
+       blk_company.eMemo.value = value
+       blk_company.eMemoAvailable.value = bool(value)
+ </action>
 
-  <action name="act_export">
-    import wx
-    fname = wx.FileSelector("Daten exportieren", default_extension="txt",
-            wildcard="*.txt", flags=wx.SAVE | wx.OVERWRITE_PROMPT)
-    if not fname:
-        return
-    form.status_message("Daten werden exportiert...")
-    blk_csv.set_filter()
-    from gnue.common.utils import ucsv
-    fieldnames = [
-            u"FA/Firma1",
-            u"FA/Firma2",
-            u"FA/Straße",
-            u"FA/PLZ",
-            u"FA/Ort",
-            u"FA/Telefon",
-            u"FA/Kategorie",
-            u"FA/Filter1",
-            u"FA/Filter2",
-            u"FA/Filter3",
-            u"ASP/Anrede",
-            u"ASP/Titel",
-            u"ASP/Vorname",
-            u"ASP/Nachname",
-            u"ASP/Abteilung",
-            u"ASP/Funktion",
-            u"ASP/Telefon",
-            u"ASP/Mobil",
-            u"ASP/Filter1",
-            u"ASP/Filter2",
-            u"ASP/Filter3"]
-    ucsv.write_file(fieldnames, blk_csv.get_data(fieldnames), fname,
-            dialect="excel-tab", encoding="cp1250")
-    form.status_message("")
-    form.show_message("Datenexport beendet")
-  </action>
+ <action name="act_memo_contact">
+   params = {'prm_memo': blk_contact.eMemo.value}
+   activateDialog('dlg_memo', params, True)
+   if params.get('prm_mres'):
+       value = params['prm_memo']
+       blk_contact.eMemo.value = value
+       blk_contact.eMemoAvailable.value = bool(value)
+ </action>
 
-  <!-- ==================================================================== -->
-  <!-- Edit memo                                                            -->
-  <!-- ==================================================================== -->
+ <action name="act_export">
+   import wx
+   fname = wx.FileSelector("Daten exportieren", default_extension="txt",
+           wildcard="*.txt", flags=wx.SAVE | wx.OVERWRITE_PROMPT)
+   if not fname:
+       return
+   form.status_message("Daten werden exportiert...")
+   blk_csv.set_filter()
+   from gnue.common.utils import ucsv
+   fieldnames = [
+           u"FID",
+           u"FA/Firma1",
+           u"FA/Firma2",
+           u"FA/Straße",
+           u"FA/PLZ",
+           u"FA/Ort",
+           u"FA/Telefon",
+           u"FA/Kategorie",
+           u"FA/Filter1",
+           u"FA/Filter2",
+           u"FA/Filter3",
+           u"ASP/Anrede",
+           u"ASP/Titel",
+           u"ASP/Vorname",
+           u"ASP/Nachname",
+           u"ASP/Abteilung",
+           u"ASP/Funktion",
+           u"ASP/Telefon",
+           u"ASP/Mobil",
+           u"ASP/EMail",
+           u"ASP/Filter1",
+           u"ASP/Filter2",
+           u"ASP/Filter3"]
 
-  <dialog name="dlg_memo" title="Memo bearbeiten">
-    <parameter name="prm_memo" datatype="text"/>
-    <parameter name="prm_mres" datatype="boolean"/>
+   master = blk_company.get_data(['id'])
+   detail = blk_csv.get_data(fieldnames)
 
-    <trigger type="On-Activation">act_init.run()</trigger>
+   neu = []
+   for row in master:
+       mid = int(row['id'])
 
-    <!-- ================================================================== -->
+       # haben wir ein Detail
+       for drow in detail:
+           if int(drow['FID']) == mid:
+               neu.append(drow)
 
-    <logic>
-      <block name="blk">
-        <field name="memo" datatype="text"/>
-      </block>
-    </logic>
+   ucsv.write_file(fieldnames, neu, fname,
+           dialect="excel-tab", encoding="cp1250")
+   form.status_message("")
+   form.show_message("Datenexport beendet")
+ </action>
 
-    <!-- ================================================================== -->
+ <!-- ==================================================================== -->
 
-    <layout xmlns:s="GNUe:Layout:Sizer">
-      <page name="Page">
-        <vbox block="blk">
-          <hbox>
-            <entry field="memo" label="Memo:" style="multiline" s:def_width="60" s:def_height="20" s:max_height="100"/>
-          </hbox>
+ <action name="to_clipboard">
+   import wx
+   import os
+   clp = wx.TheClipboard
 
-          <hbox>
-            <button label="Ok" action="act_ok"/>
-            <button label="Abbrechen" action="act_cancel"/>
-          </hbox>
-        </vbox>
-      </page>
-    </layout>
+   if clp.Open():
+     try:
+       zeilen = []
+       clp.Clear()
 
-    <!-- ================================================================== -->
+       if blk_company.eName1.value:
+         zeilen.append(blk_company.eName1.value)
 
-    <action name="act_init">
-      blk.memo.value = prm_memo.value
-      setFocus(blk.memo)
-    </action>
+       if blk_company.eName2.value:
+         zeilen.append(blk_company.eName2.value)
 
-    <action name="act_ok">
-      prm_memo.value = blk.memo.value
-      prm_mres.value = True
-      form.close()
-    </action>
+       if blk_company.eStreet.value:
+         zeilen.append(blk_company.eStreet.value)
 
-    <action name="act_cancel">
-      prm_mres.value = False
-      form.close()
-    </action>
-  </dialog>
+       teil = []
+       if blk_company.eZIP.value:
+         teil.append(blk_company.eZIP.value)
 
-  <!-- ==================================================================== -->
-  <!-- Search by company                                                    -->
-  <!-- ==================================================================== -->
+       if blk_company.eCity.value:
+         teil.append(blk_company.eCity.value)
 
-  <dialog name="dlg_search_company" title="Suche nach Firma">
-    <parameter name="prm_result" datatype="number" length="8" scale="0"/>
-    <parameter name="prm_search" datatype="text" length="100" />
+       if teil:
+         zeilen.append(' '.join(teil))
 
-    <trigger type="ON-ACTIVATION">act_initialize.run()</trigger>
+       txt = wx.TextDataObject()
+       txt.SetText(os.linesep.join(zeilen))
+       clp.AddData(txt)
 
-    <datasource name="dts_company" connection="address" table="company">
-      <sortorder>
-        <sortfield name="name1" descending="N" ignorecase="Y"/>
-      </sortorder>
-    </datasource>
+       clp.Flush()
 
-    <!-- ================================================================== -->
+     finally:
+       clp.Close()
+ </action>
 
-    <logic>
-      <block name="blk">
-        <field name="search" datatype="text" length="64" case="upper"/>
-      </block>
+ <!-- ==================================================================== -->
+ <!-- Edit memo                                                            -->
+ <!-- ==================================================================== -->
 
-      <block name="blk_company" datasource="dts_company" startup="empty" editable="N" deletable="N">
-        <field name="id"        field="id"         datatype="number" length="8"/>
-        <field name="matchcode" field="matchcode"  datatype="text"   length="20"/>
-        <field name="name1"     field="name1"      datatype="text"   length="64"/>
-        <field name="name2"     field="name2"      datatype="text"   length="64"/>
-        <field name="street"    field="street"     datatype="text"   length="64"/>
-        <field name="city"      field="city"       datatype="text"   length="64"/>
-      </block>
-    </logic>
+ <dialog name="dlg_memo" title="Memo bearbeiten">
+   <parameter name="prm_memo" datatype="text"/>
+   <parameter name="prm_mres" datatype="boolean"/>
 
-    <!-- ================================================================== -->
+   <trigger type="On-Activation">act_init.run()</trigger>
 
-    <layout>
-      <page name="pg">
-        <vbox>
-          <entry block="blk" field="search" label="Suchbegriff:"/>
+   <!-- ================================================================== -->
 
-          <grid block="blk_company" rows="20">
-            <gridline>
-              <button label="Auswählen" action="act_select">
-                <trigger type="POST-FOCUSIN">act_button_focus.run()</trigger>
-              </button>
-              <entry  field="matchcode" label="Match"   navigable="N"/>
-              <entry  field="name1"     label="Firma-1" navigable="N"/>
-              <entry  field="name2"     label="Firma-2" navigable="N"/>
-              <entry  field="street"    label="Straße"  navigable="N"/>
-              <entry  field="city"      label="Ort"     navigable="N"/>
-            </gridline>
-          </grid>
-        </vbox>
-      </page>
-    </layout>
+   <logic>
+     <block name="blk">
+       <field name="memo" datatype="text"/>
+     </block>
+   </logic>
 
-    <!-- ================================================================== -->
+   <!-- ================================================================== -->
 
-    <action name="act_initialize">
-      blk.search.value = None
-      blk_company.clear()
-      setFocus(blk.search)
-      setParameter('prm_search', '')
-    </action>
+   <layout xmlns:s="GNUe:Layout:Sizer">
+     <page name="Page">
+       <vbox block="blk">
+         <hbox>
+           <entry field="memo" label="Memo:" style="multiline" s:def_width="60" s:def_height="20" s:max_height="100"/>
+         </hbox>
 
-    <action name="act_filter">
-      # This is a workaround for SQLite3 not knowing that UPPER('ä') = 'Ä'.
-      def build(aval, last=0):
-        cmap = {u'ö': u'Ö', u'Ö': u'ö',
-                u'ä': u'Ä', u'Ä': u'ä',
-                u'ü': u'Ü', u'Ü': u'ü'}
+         <hbox>
+           <button label="Ok" action="act_ok"/>
+           <button label="Abbrechen" action="act_cancel"/>
+         </hbox>
+       </vbox>
+     </page>
+   </layout>
 
-        result = []
+   <!-- ================================================================== -->
 
-        for ix in range(last, len(aval)):
-          if aval[ix] in cmap:
-            cc = aval[ix]
-            newval = aval[0:ix] + cmap[cc] + aval[ix + 1:]
+   <action name="act_init">
+     blk.memo.value = prm_memo.value
+     setFocus(blk.memo)
+   </action>
 
-            xres = build(newval, ix + 1)
-            result.extend(xres)
+   <action name="act_ok">
+     prm_memo.value = blk.memo.value
+     prm_mres.value = True
+     form.close()
+   </action>
 
-        result.append(aval)
-        return result
+   <action name="act_cancel">
+     prm_mres.value = False
+     form.close()
+   </action>
+ </dialog>
 
-      def build_pattern(pattern):
-        result = []
+ <!-- ==================================================================== -->
+ <!-- Search by company                                                    -->
+ <!-- ==================================================================== -->
 
-        for item in build(pattern):
-          result.extend ([ \
-            ['like', ['upper', ['field', 'matchcode']], ['const', item]], \
-            ['like', ['upper', ['field', 'name1']], ['const', item]], \
-            ['like', ['upper', ['field', 'name2']], ['const', item]]])
+ <dialog name="dlg_search_company" title="Suche nach Firma">
+   <parameter name="prm_result" datatype="number" length="8" scale="0"/>
+   <parameter name="prm_search" datatype="text" length="100" />
 
-        result.insert(0, 'or')
-        return result
+   <trigger type="ON-ACTIVATION">act_initialize.run()</trigger>
 
-      val = blk.search.value
-      old = getParameter('prm_search')
+   <datasource name="dts_company" connection="address" table="company">
+     <sortorder>
+       <sortfield name="name1" descending="N" ignorecase="Y"/>
+     </sortorder>
+   </datasource>
 
-      if old != val:
-          if val is not None:
-              blk_company.query(build_pattern("%%" + val + "%%"))
-          else:
-              blk_company.clear()
+   <!-- ================================================================== -->
 
-          setParameter('prm_search', val)
-    </action>
+   <logic>
+     <block name="blk">
+       <field name="search" datatype="text" length="64" case="upper"/>
+     </block>
 
-    <action name="act_button_focus">
-      act_filter.run()
-      # FIXME: get_record_count not available before gnue-forms 0.6-pre1
-      # if blk_company.get_record_count() == 1 and blk_company.get_record_status() == 'clean':
-      if blk_company.getResultSet().getRecordCount() == 1 and blk_company.get_record_status() == 'clean':
-          act_select.run()
-    </action>
+     <block name="blk_company" datasource="dts_company" startup="empty" editable="N" deletable="N">
+       <field name="id"        field="id"         datatype="number" length="8"/>
+       <field name="matchcode" field="matchcode"  datatype="text"   length="20"/>
+       <field name="name1"     field="name1"      datatype="text"   length="64"/>
+       <field name="name2"     field="name2"      datatype="text"   length="64"/>
+       <field name="street"    field="street"     datatype="text"   length="64"/>
+       <field name="city"      field="city"       datatype="text"   length="64"/>
+     </block>
+   </logic>
 
-    <action name="act_select">
-      prm_result.value = blk_company.id.value
-      # Workaround for a bug in wx: setting the focus in ON-ACTIVATION does not
-      # work for modal dialogs. So we reset the focus here before closing.
-      setFocus(blk.search)
-      form.close()
-    </action>
-  </dialog>
+   <!-- ================================================================== -->
 
-  <!-- ==================================================================== -->
-  <!-- Search by contact                                                    -->
-  <!-- ==================================================================== -->
+   <layout>
+     <page name="pg">
+       <vbox>
+         <entry block="blk" field="search" label="Suchbegriff:"/>
 
-  <dialog name="dlg_search_contact" title="Suche nach Ansprechperson">
-    <parameter name="prm_company" datatype="number" length="8" scale="0"/>
-    <parameter name="prm_contact" datatype="number" length="8" scale="0"/>
-    <parameter name="prm_search" datatype="text" length="120" />
+         <grid block="blk_company" rows="20">
+           <gridline>
+             <button label="Auswählen" action="act_select">
+               <trigger type="POST-FOCUSIN">act_button_focus.run()</trigger>
+             </button>
+             <entry  field="matchcode" label="Match"   navigable="N"/>
+             <entry  field="name1"     label="Firma-1" navigable="N"/>
+             <entry  field="name2"     label="Firma-2" navigable="N"/>
+             <entry  field="street"    label="Straße"  navigable="N"/>
+             <entry  field="city"      label="Ort"     navigable="N"/>
+           </gridline>
+         </grid>
+       </vbox>
+     </page>
+   </layout>
 
-    <trigger type="ON-ACTIVATION">act_initialize.run()</trigger>
+   <!-- ================================================================== -->
 
-    <datasource name="dts_contact" connection="address"
-      table="contact left outer join company on contact.company = company.id"
-      primarykey="contact.id">
-      <sortorder>
-        <sortfield name="surname" descending="N" ignorecase="Y"/>
-      </sortorder>
-    </datasource>
+   <action name="act_initialize">
+     blk.search.value = None
+     blk_company.clear()
+     setFocus(blk.search)
+     setParameter('prm_search', '')
+   </action>
 
-    <!-- ================================================================== -->
+   <action name="act_filter">
+     # This is a workaround for SQLite3 not knowing that UPPER('ä') = 'Ä'.
+     def build(aval, last=0):
+       cmap = {u'ö': u'Ö', u'Ö': u'ö',
+               u'ä': u'Ä', u'Ä': u'ä',
+               u'ü': u'Ü', u'Ü': u'ü'}
 
-    <logic>
-      <block name="blk">
-        <field name="search" datatype="text" length="64" case="upper"/>
-      </block>
+       result = []
 
-      <block name="blk_contact" datasource="dts_contact" startup="empty" editable="N" deletable="N">
-        <field name="id"        field="contact.id" datatype="number" length="8"/>
-        <field name="company"   field="company"    datatype="number" length="8"/>
-        <field name="surname"   field="surname"    datatype="text"   length="32"/>
-        <field name="firstname" field="firstname"  datatype="text"   length="32"/>
-        <field name="name1"     field="name1"      datatype="text"   length="64"/>
-        <field name="name2"     field="name2"      datatype="text"   length="64"/>
-        <field name="city"      field="city"       datatype="text"   length="64"/>
-      </block>
-    </logic>
+       for ix in range(last, len(aval)):
+         if aval[ix] in cmap:
+           cc = aval[ix]
+           newval = aval[0:ix] + cmap[cc] + aval[ix + 1:]
 
-    <!-- ================================================================== -->
+           xres = build(newval, ix + 1)
+           result.extend(xres)
 
-    <layout>
-      <page name="pg">
-        <vbox>
-          <entry block="blk" field="search" label="Suchbegriff:"/>
+       result.append(aval)
+       return result
 
-          <grid block="blk_contact" rows="20">
-            <gridline>
-              <button label="Auswählen" action="act_select">
-                <trigger type="POST-FOCUSIN">act_button_focus.run()</trigger>
-              </button>
-              <entry  field="surname"   label="Nachname" navigable="N"/>
-              <entry  field="firstname" label="Vorname"  navigable="N"/>
-              <entry  field="name1"     label="Firma-1"  navigable="N"/>
-              <entry  field="name2"     label="Firma-2"  navigable="N"/>
-              <entry  field="city"      label="Ort"      navigable="N"/>
-            </gridline>
-          </grid>
-        </vbox>
-      </page>
-    </layout>
+     def build_pattern(pattern):
+       result = []
 
-    <!-- ================================================================== -->
+       for item in build(pattern):
+         result.extend ([ \
+           ['like', ['upper', ['field', 'matchcode']], ['const', item]], \
+           ['like', ['upper', ['field', 'name1']], ['const', item]], \
+           ['like', ['upper', ['field', 'name2']], ['const', item]]])
 
-    <action name="act_initialize">
-      blk.search.value = None
-      blk_contact.clear()
-      setFocus(blk.search)
-      setParameter('prm_search', None)
-    </action>
+       result.insert(0, 'or')
+       return result
 
-    <action name="act_filter">
-      # This is a workaround for SQLite3 not knowing that UPPER('ä') = 'Ä'.
-      def build(aval, last=0):
-        cmap = {u'ö': u'Ö', u'Ö': u'ö',
-                u'ä': u'Ä', u'Ä': u'ä',
-                u'ü': u'Ü', u'Ü': u'ü'}
+     val = blk.search.value
+     old = getParameter('prm_search')
 
-        result = []
+     if old != val:
+         if val is not None:
+             blk_company.query(build_pattern("%%" + val + "%%"))
+         else:
+             blk_company.clear()
 
-        for ix in range(last, len(aval)):
-          if aval[ix] in cmap:
-            cc = aval[ix]
-            newval = aval[0:ix] + cmap[cc] + aval[ix + 1:]
+         setParameter('prm_search', val)
+   </action>
 
-            xres = build(newval, ix + 1)
-            result.extend(xres)
+   <action name="act_button_focus">
+     act_filter.run()
+     # FIXME: get_record_count not available before gnue-forms 0.6-pre1
+     # if blk_company.get_record_count() == 1 and blk_company.get_record_status() == 'clean':
+     if blk_company.getResultSet().getRecordCount() == 1 and blk_company.get_record_status() == 'clean':
+         act_select.run()
+   </action>
 
-        result.append(aval)
-        return result
+   <action name="act_select">
+     prm_result.value = blk_company.id.value
+     # Workaround for a bug in wx: setting the focus in ON-ACTIVATION does not
+     # work for modal dialogs. So we reset the focus here before closing.
+     setFocus(blk.search)
+     form.close()
+   </action>
+ </dialog>
 
-      def build_pattern(pattern):
-        result = []
+ <!-- ==================================================================== -->
+ <!-- Search by contact                                                    -->
+ <!-- ==================================================================== -->
 
-        for item in build(pattern):
-          result.extend ([['like', ['upper', ['field', 'surname']], ['const', item]],
-                          ['like', ['upper', ['field', 'firstname']], ['const', item]]])
+ <dialog name="dlg_search_contact" title="Suche nach Ansprechperson">
+   <parameter name="prm_company" datatype="number" length="8" scale="0"/>
+   <parameter name="prm_contact" datatype="number" length="8" scale="0"/>
+   <parameter name="prm_search" datatype="text" length="120" />
 
-        result.insert(0, 'or')
-        return result
+   <trigger type="ON-ACTIVATION">act_initialize.run()</trigger>
 
-      val = blk.search.value
-      old = getParameter('prm_search')
-      if old != val:
-          if val is not None:
-              blk_contact.query(build_pattern("%%" + val + "%%"))
-          else:
-              blk_contact.clear()
+   <datasource name="dts_contact" connection="address"
+     table="contact left outer join company on contact.company = company.id"
+     primarykey="contact.id">
+     <sortorder>
+       <sortfield name="surname" descending="N" ignorecase="Y"/>
+     </sortorder>
+   </datasource>
 
-          setParameter('prm_search', val)
-    </action>
+   <!-- ================================================================== -->
 
-    <action name="act_button_focus">
-      act_filter.run()
-      # FIXME: get_record_count not available before gnue-forms 0.6-pre1
-      # if blk_contact.get_record_count() == 1 and blk_contact.get_record_status() == 'clean':
-      if blk_contact.getResultSet().getRecordCount() == 1 and blk_contact.get_record_status() == 'clean':
-          act_select.run()
-    </action>
+   <logic>
+     <block name="blk">
+       <field name="search" datatype="text" length="64" case="upper"/>
+     </block>
 
-    <action name="act_select">
-      prm_company.value = blk_contact.company.value
-      prm_contact.value = blk_contact.id.value
-      # Workaround for a bug in wx: setting the focus in ON-ACTIVATION does not
-      # work for modal dialogs. So we reset the focus here before closing.
-      setFocus(blk.search)
-      form.close()
-    </action>
-  </dialog>
+     <block name="blk_contact" datasource="dts_contact" startup="empty" editable="N" deletable="N">
+       <field name="id"        field="contact.id" datatype="number" length="8"/>
+       <field name="company"   field="company"    datatype="number" length="8"/>
+       <field name="surname"   field="surname"    datatype="text"   length="32"/>
+       <field name="firstname" field="firstname"  datatype="text"   length="32"/>
+       <field name="name1"     field="name1"      datatype="text"   length="64"/>
+       <field name="name2"     field="name2"      datatype="text"   length="64"/>
+       <field name="city"      field="city"       datatype="text"   length="64"/>
+     </block>
+   </logic>
 
-  <!-- ==================================================================== -->
-  <!-- Search by phone number                                               -->
-  <!-- ==================================================================== -->
+   <!-- ================================================================== -->
 
-  <dialog name="dlg_search_phone" title="Suche nach Telefonnummer">
-    <parameter name="prm_company" datatype="number" length="8" scale="0"/>
-    <parameter name="prm_contact" datatype="number" length="8" scale="0"/>
-    <parameter name="prm_search" datatype="text" length="120" />
+   <layout>
+     <page name="pg">
+       <vbox>
+         <entry block="blk" field="search" label="Suchbegriff:"/>
 
-    <trigger type="ON-ACTIVATION">act_initialize.run()</trigger>
+         <grid block="blk_contact" rows="20">
+           <gridline>
+             <button label="Auswählen" action="act_select">
+               <trigger type="POST-FOCUSIN">act_button_focus.run()</trigger>
+             </button>
+             <entry  field="surname"   label="Nachname" navigable="N"/>
+             <entry  field="firstname" label="Vorname"  navigable="N"/>
+             <entry  field="name1"     label="Firma-1"  navigable="N"/>
+             <entry  field="name2"     label="Firma-2"  navigable="N"/>
+             <entry  field="city"      label="Ort"      navigable="N"/>
+           </gridline>
+         </grid>
+       </vbox>
+     </page>
+   </layout>
 
-    <datasource name="dts_contact" connection="address"
-      table="contact left outer join company on contact.company = company.id"
-      primarykey="contact.id">
-      <sortorder>
-        <sortfield name="surname" descending="N" ignorecase="Y"/>
-      </sortorder>
-    </datasource>
+   <!-- ================================================================== -->
 
-    <!-- ================================================================== -->
+   <action name="act_initialize">
+     blk.search.value = None
+     blk_contact.clear()
+     setFocus(blk.search)
+     setParameter('prm_search', None)
+   </action>
 
-    <logic>
-      <block name="blk">
-        <field name="search" datatype="text" length="64" case="upper"/>
-      </block>
+   <action name="act_filter">
+     # This is a workaround for SQLite3 not knowing that UPPER('ä') = 'Ä'.
+     def build(aval, last=0):
+       cmap = {u'ö': u'Ö', u'Ö': u'ö',
+               u'ä': u'Ä', u'Ä': u'ä',
+               u'ü': u'Ü', u'Ü': u'ü'}
 
-      <block name="blk_contact" datasource="dts_contact" startup="empty" editable="N" deletable="N">
-        <field name="id"        field="contact.id" datatype="number" length="8"/>
-        <field name="company"   field="company"    datatype="number" length="8"/>
-        <field name="surname"   field="surname"    datatype="text"   length="16"/>
-        <field name="firstname" field="firstname"  datatype="text"   length="16"/>
-        <field name="phone1"    field="phone1"     datatype="text"   length="16"/>
-        <field name="phone2"    field="phone2"     datatype="text"   length="16"/>
-        <field name="name1"     field="name1"      datatype="text"   length="32"/>
-        <field name="phone"     field="phone"      datatype="text"   length="16"/>
-      </block>
-    </logic>
+       result = []
 
-    <!-- ================================================================== -->
+       for ix in range(last, len(aval)):
+         if aval[ix] in cmap:
+           cc = aval[ix]
+           newval = aval[0:ix] + cmap[cc] + aval[ix + 1:]
 
-    <layout>
-      <page name="pg">
-        <vbox>
-          <entry block="blk" field="search" label="Suchbegriff:"/>
+           xres = build(newval, ix + 1)
+           result.extend(xres)
 
-          <grid block="blk_contact" rows="20">
-            <gridline>
-              <button label="Auswählen" action="act_select">
-                <trigger type="POST-FOCUSIN">act_button_focus.run()</trigger>
-              </button>
-              <entry  field="surname"   label="Nachname"  navigable="N"/>
-              <entry  field="firstname" label="Vorname"   navigable="N"/>
-              <entry  field="phone1"    label="Telefon 1" navigable="N"/>
-              <entry  field="phone2"    label="Telefon 2" navigable="N"/>
-              <entry  field="name1"     label="Firma-1"   navigable="N"/>
-              <entry  field="phone"     label="Telefon"   navigable="N"/>
-            </gridline>
-          </grid>
-        </vbox>
-      </page>
-    </layout>
+       result.append(aval)
+       return result
 
-    <!-- ================================================================== -->
+     def build_pattern(pattern):
+       result = []
 
-    <action name="act_initialize">
-      blk.search.value = None
-      blk_contact.clear()
-      setFocus(blk.search)
-      setParameter('prm_search', None)
-    </action>
+       for item in build(pattern):
+         result.extend ([['like', ['upper', ['field', 'surname']], ['const', item]],
+                         ['like', ['upper', ['field', 'firstname']], ['const', item]]])
 
-    <action name="act_filter">
-      val = blk.search.value
-      old = getParameter('prm_search')
-      if old != val:
-          if val is not None:
-              item = "%" + val + "%"
-              blk_contact.query(['or',
-                    ['like', ['field', 'phone1x'], ['const', item]],
-                    ['like', ['field', 'phone2x'], ['const', item]],
-                    ['like', ['field', 'phonex'], ['const', item]]])
-          else:
-              blk_contact.clear()
+       result.insert(0, 'or')
+       return result
 
-          setParameter('prm_search', val)
-    </action>
+     val = blk.search.value
+     old = getParameter('prm_search')
+     if old != val:
+         if val is not None:
+             blk_contact.query(build_pattern("%%" + val + "%%"))
+         else:
+             blk_contact.clear()
 
-    <action name="act_button_focus">
-      act_filter.run()
-      # FIXME: get_record_count not available before gnue-forms 0.6-pre1
-      # if blk_contact.get_record_count() == 1 and blk_contact.get_record_status() == 'clean':
-      if blk_contact.getResultSet().getRecordCount() == 1 and blk_contact.get_record_status() == 'clean':
-          act_select.run()
-    </action>
+         setParameter('prm_search', val)
+   </action>
 
-    <action name="act_select">
-      prm_company.value = blk_contact.company.value
-      prm_contact.value = blk_contact.id.value
-      # Workaround for a bug in wx: setting the focus in ON-ACTIVATION does not
-      # work for modal dialogs. So we reset the focus here before closing.
-      setFocus(blk.search)
-      form.close()
-    </action>
-  </dialog>
+   <action name="act_button_focus">
+     act_filter.run()
+     # FIXME: get_record_count not available before gnue-forms 0.6-pre1
+     # if blk_contact.get_record_count() == 1 and blk_contact.get_record_status() == 'clean':
+     if blk_contact.getResultSet().getRecordCount() == 1 and blk_contact.get_record_status() == 'clean':
+         act_select.run()
+   </action>
+
+   <action name="act_select">
+     prm_company.value = blk_contact.company.value
+     prm_contact.value = blk_contact.id.value
+     # Workaround for a bug in wx: setting the focus in ON-ACTIVATION does not
+     # work for modal dialogs. So we reset the focus here before closing.
+     setFocus(blk.search)
+     form.close()
+   </action>
+ </dialog>
+
+ <!-- ==================================================================== -->
+ <!-- Search by phone number                                               -->
+ <!-- ==================================================================== -->
+
+ <dialog name="dlg_search_phone" title="Suche nach Telefonnummer">
+   <parameter name="prm_company" datatype="number" length="8" scale="0"/>
+   <parameter name="prm_contact" datatype="number" length="8" scale="0"/>
+   <parameter name="prm_search" datatype="text" length="120" />
+
+   <trigger type="ON-ACTIVATION">act_initialize.run()</trigger>
+
+   <datasource name="dts_contact" connection="address"
+     table="contact left outer join company on contact.company = company.id"
+     primarykey="contact.id">
+     <sortorder>
+       <sortfield name="surname" descending="N" ignorecase="Y"/>
+     </sortorder>
+   </datasource>
+
+   <!-- ================================================================== -->
+
+   <logic>
+     <block name="blk">
+       <field name="search" datatype="text" length="64" case="upper"/>
+     </block>
+
+     <block name="blk_contact" datasource="dts_contact" startup="empty" editable="N" deletable="N">
+       <field name="id"        field="contact.id" datatype="number" length="8"/>
+       <field name="company"   field="company"    datatype="number" length="8"/>
+       <field name="surname"   field="surname"    datatype="text"   length="16"/>
+       <field name="firstname" field="firstname"  datatype="text"   length="16"/>
+       <field name="phone1"    field="phone1"     datatype="text"   length="16"/>
+       <field name="phone2"    field="phone2"     datatype="text"   length="16"/>
+       <field name="name1"     field="name1"      datatype="text"   length="32"/>
+       <field name="phone"     field="phone"      datatype="text"   length="16"/>
+     </block>
+   </logic>
+
+   <!-- ================================================================== -->
+
+   <layout>
+     <page name="pg">
+       <vbox>
+         <entry block="blk" field="search" label="Suchbegriff:"/>
+
+         <grid block="blk_contact" rows="20">
+           <gridline>
+             <button label="Auswählen" action="act_select">
+               <trigger type="POST-FOCUSIN">act_button_focus.run()</trigger>
+             </button>
+             <entry  field="surname"   label="Nachname"  navigable="N"/>
+             <entry  field="firstname" label="Vorname"   navigable="N"/>
+             <entry  field="phone1"    label="Telefon 1" navigable="N"/>
+             <entry  field="phone2"    label="Telefon 2" navigable="N"/>
+             <entry  field="name1"     label="Firma-1"   navigable="N"/>
+             <entry  field="phone"     label="Telefon"   navigable="N"/>
+           </gridline>
+         </grid>
+       </vbox>
+     </page>
+   </layout>
+
+   <!-- ================================================================== -->
+
+   <action name="act_initialize">
+     blk.search.value = None
+     blk_contact.clear()
+     setFocus(blk.search)
+     setParameter('prm_search', None)
+   </action>
+
+   <action name="act_filter">
+     val = blk.search.value
+     old = getParameter('prm_search')
+     if old != val:
+         if val is not None:
+             item = "%" + val + "%"
+             blk_contact.query(['or',
+                   ['like', ['field', 'phone1x'], ['const', item]],
+                   ['like', ['field', 'phone2x'], ['const', item]],
+                   ['like', ['field', 'phonex'], ['const', item]]])
+         else:
+             blk_contact.clear()
+
+         setParameter('prm_search', val)
+   </action>
+
+   <action name="act_button_focus">
+     act_filter.run()
+     # FIXME: get_record_count not available before gnue-forms 0.6-pre1
+     # if blk_contact.get_record_count() == 1 and blk_contact.get_record_status() == 'clean':
+     if blk_contact.getResultSet().getRecordCount() == 1 and blk_contact.get_record_status() == 'clean':
+         act_select.run()
+   </action>
+
+   <action name="act_select">
+     prm_company.value = blk_contact.company.value
+     prm_contact.value = blk_contact.id.value
+     # Workaround for a bug in wx: setting the focus in ON-ACTIVATION does not
+     # work for modal dialogs. So we reset the focus here before closing.
+     setFocus(blk.search)
+     form.close()
+   </action>
+ </dialog>
 </form>

Modified: address/schema/schema.gsd
===================================================================
--- address/schema/schema.gsd	2007-11-08 08:09:34 UTC (rev 284)
+++ address/schema/schema.gsd	2008-07-29 08:44:27 UTC (rev 285)
@@ -62,6 +62,14 @@
         <field name="filter1"    type="boolean"/>
         <field name="filter2"    type="boolean"/>
         <field name="filter3"    type="boolean"/>
+        <field name="corp_film"  type="boolean" />
+        <field name="event"      type="boolean" />
+        <field name="werbung"    type="boolean" />
+        <field name="pproduct"   type="boolean" />
+        <field name="adaptionen" type="boolean" />
+        <field name="vermietung" type="boolean" />
+        <field name="tv"         type="boolean" />
+        <field name="reserve"    type="boolean" />
       </fields>
 
       <primarykey name="pk_contact">
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.