deleteclient.php version 0.02ff

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

deleteclient.php version 0.02ff

Beitrag von knb » Mo 17. Okt 2005, 16:13

Hier eine neue, etwas vollständigere Version des deleteclient.php scripts für Contenido Version 4.5.3.

Diese löscht weiteren Tabellen die mit idClient verknüpften Datensätze.


edit: durch neuere version ersetzt, siehe unten
Zuletzt geändert von knb am Mi 16. Nov 2005, 14:06, insgesamt 1-mal geändert.
Gruss,
Knut

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mo 17. Okt 2005, 20:04

da du es erwähnst...
lang_bereich, lang_key, lang_value, data, config_client, config

sind irrelevant da sie in den aktuellen releases nicht mehr verwendet werden...

das posting hättest du ruhig ans andere ranhängen können
*** make your own tools (wishlist :: thx)

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

deleteclient.php version 0.03

Beitrag von knb » Di 18. Okt 2005, 09:34

noch einmal dasselbe script mit leicht überarbeitetem Hinweistext und Versionsgeschichte.
TODO: klären was mit cat_tree passieren soll.

edit: durch neuere Version ersetzt, siehe unten
Zuletzt geändert von knb am Mi 16. Nov 2005, 14:07, insgesamt 1-mal geändert.
Gruss,
Knut

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

0.06: INNER JOIN Syntax weg, multiple-table-DELETE noch drin

Beitrag von knb » Fr 28. Okt 2005, 13:08

Code: Alles auswählen


<?php
/* Dieses Script l&ouml;scht die meisten Tabelleneinträge
 * von einem Mandanten ($old_idclient) .
 * Version 0.07 20060524
 * 
 * 0.07 Bugfix:  $clients_lang wurde nicht richtig gesetzt 
 * 0.06: Hinweistexte verbessert , toten Code entfernt (ein bisschen ist wohl noch drin), INNER JOIN Syntax weg
 * 0.05: Neuaufbau von cat_tree wird auch "simuliert"
 * 0.04: 20051028: mehr Tabellen: Module translations, newslettergroups und newslettergroupmembers, art_spec werden auch gelöscht.
 * 0.03: nur Hinweistexte korrigiert, keine Änderungen am code
 * 0.02: mehr tabellen hinzugenommen
 * 0.01: minimalversion, proof-of-concept
 * Für Contenido 4.5.+ , 4.6.x . 
 * 
 * 4.4.x ungetestet  - sollte größtenteils auch gehen aber einige Tabellen existierten da noch nicht => Fehler (ignorierbar)
 * 
 * Mysql DB muss auf version 4 oder höher sein. version 3.23 hat schwierigkeiten mit dem generierten SQL Code.
 * Autor: Knut Behrends
 * Status: FUNKTIONSFÄHIG aber möglw. unvollständig (Tabellen von installierten Plugins werden ignoriert) 
 * im Datenmodell bleiben dann eventuell einige mit nichts mehr verknüpfte Datensätze zurück.
 * 
 * TODO: einbauen LOCK Tables vor jedem DELETE FROM ...
 * TODO: einbauen Fallunterscheidung: Contenidoversion bestimmen => Tabellenauswahl 
 * TODO: alternativ: if exists Tablename ...delete from
 * TODO: toten Code entfernen
 * TODO: INNER JOIN Syntax ändern zu WHERE Klausel Syntax (WHERE tabA.idClient = tabB.idClient)
 * 
 * Scriptcode z.T. auf Grundlage von CopyClient Script von A. Womatschka
 * http://www.contenido.org/forum/viewtopic.php?t=5377&highlight=copy+client
 * 
 * Datum: 2005-Sep-15
 * Zuletzt geändert am: 2006-05-24
 */

/* Viele Tabellen werden vom Script verändert. Datenbank daher besser vorher sichern.
 */

/* Anleitung:
 * Kopiere die .php-Datei mit diesem Script in das Contenido-Verzeichnis
 * z.B. contenido/tools/deleteclient.php
 * 1. Contenido db dump machen
 * 2. Abmelden von Contenido (falls noch eingeloggt)
 * 3. Script starten und optionen auswählen
 * 4. nachschauen was wirklich passiert ist
 */

if (file_exists( '../includes/startup.php'))
{
    include_once ('../includes/startup.php'); // 4.5.3
} else {
    include_once ('../includes/config.php');
}
cInclude ("includes", 'functions.general.php');

$cfg["debug"]["backend_exectime"]["fullstart"]  = getmicrotime();

cInclude ("includes", 'functions.i18n.php');
cInclude ("includes", 'functions.api.php');
cInclude ("includes", 'functions.general.php');

cInclude ("includes", 'functions.database.php');

cInclude ("classes", 'class.xml.php');
cInclude ("classes", 'class.navigation.php');
cInclude ("classes", 'class.template.php');
cInclude ("classes", 'class.backend.php');
cInclude ("classes", 'class.notification.php');
cInclude ("classes", 'class.area.php');
cInclude ("classes", 'class.action.php');

cInclude ("classes", 'class.layout.php');
cInclude ("classes", 'class.treeitem.php');
cInclude ("classes", 'class.user.php');
cInclude ("classes", 'class.group.php');
cInclude ("classes", 'class.cat.php');
cInclude ("classes", 'class.client.php');
cInclude ("classes", 'class.inuse.php');
cInclude ("classes", 'class.table.php');

cInclude ("includes", 'functions.str.php');

page_open(array('sess' => 'Contenido_Session',
                'auth' => 'Contenido_Challenge_Crypt_Auth',
                'perm' => 'Contenido_Perm'));

i18nInit($cfg["path"]["contenido"].$cfg["path"]["locale"], $belang);
cInclude ("includes", 'cfg_language_de.inc.php');

/* Instanzen der DB_Contenido */
$db = new DB_Contenido;  // strMakeTreeTable funktioniert nur mit globalem $db ?

$cfg["debug"]["backend_exectime"]["start"]  = getmicrotime();


?>
<html>
<head>
    <title></title>
    <link rel="stylesheet" type="text/css" href="styles/contenido.css" />
    <script type="text/javascript" src="scripts/general.js"></script>
<style type="text/css">
<!--
/* Cascading Style Sheet */

BODY,P,TD { font-family : verdana, arial, helvetica, sans-serif; }
BODY,P,TD { font-size : 11px; }

A:active,A:link,A:visited { text-decoration : none; }
A:hover { text-decoration : underline; }

P { text-align : justify; line-height: 140%; }

.red  { color : #FF0000; }
.grey  { color : #333333; }
.darkgrey  { color : #525169; }
.blue { color : #0055dd; }
.white { color : #FFFFFF; }

-->
</style>
</head>
<body style="margin: 10px">
<h2 class="red"><b>CONTENIDO CLIENT BACKEND DELETION SCRIPT</b></h2>
<p class="red"><b>Dieses Script l&ouml;scht einen Contenido Mandanten/Client aus der Mysql Datenbank.</b></p>
<ol>
  <li>(notwendig) Sicherstellen dass mysql Version 4.0 oder höher ist. Script funktioniert nicht mit mysql Release 3.23!</li>
  <li>(empfohlen) contenido mysql Datenbank sichern. PHP Code dieses Scripts ansehen.</li>
  <li>(erledigt?) Melde dich als sysadmin an Contenido an (oder mit einem anderen Account welches Sysadmin Recht hat)</li>
  <li>(optional) Merke dir zur Dokumentation den Namen und die ID des zu l&ouml;schenden Mandanten. Dieses Script arbeitet mit der ID. Dieser Parameter idclient wird sp&auml;ter nicht mehr verf&uuml;gbar sein.</li>
	<li>(optional) Eingeloggte User benachrichtigen, denn Kategoriebaum wird neu aufgebaut, alle Artikel in Bearbeitung entsperrt. </li>
  <li>(optional) Abmelden von Contenido, falls mit anderem Browserfenster noch eingeloggt. </li>
  <li>(optional) Im Formular "Simulationsmodus" + Mandanten ausw&auml;hlen und abschicken, SQL-Code ansehen und ggf. zur Dokumentation speichern</li>
  <li> Mandanten ausw&auml;hlen und abschicken. Mandant wird gelöscht.</li>
</ol>
<h3>Anmerkungen:</h3>
<p>Dieses Script hat KEINE "R&uuml;ckg&auml;ngig machen" Funktionalit&auml;t. Stattdessen alte Datenbanksicherung wieder einspielen.<br>
  Das Script greift direkt auf die mysql Tabellen zu und löscht nur die von idClient abhängigen Datenbankeintr&auml;ge.</p>
<p> Es werden gelöscht bzw neu aufgebaut:
</p>
<ul>
  <li>Clientbezogene Backend-Nutzerrechte an Objekten</li>
  <li>Cached Code</li>
  <li>Statistikdaten</li>
  <li>Communications Tabelle</li>
  <li>Upload Tabelleneintr&auml;ge</li>
  <li>Plugin Registrations</li>
  <li>DB Filesystem Eintr&auml;ge</li>
  <li>User-defined Client-Properties</li>
  <li>Links</li>
  <li>Newsletter und Newsletter Recipients</li>
  <li>Artikel (Inhalte und Metadaten, Metatags, Spezifikationen)</li>
  <li>cat_tree (Kategoriebaum - betrifft ALLE Mandanten!)</li>
  <li>Module Modulgeschichte, Modulsprachversionen</li>
  <li>Templates</li>
  <li>Layouts</li>
  <li>Container </li>
  <li>Kategorien </li>
  <li>Newslettergroups und Newsletter-Groupmembers</li>
  <li>Dem Client zugeordnete Frontendgroups und Frontend-Users sowie -Rechte</li>
  <li>der Client selbst</li>
</ul>
<p>Es werden NICHT gel&ouml;scht</p>
<ul>
  <li>Keywords (L&ouml;schvorgang kann recht lang dauern - PHP codezeile ist auskommentiert)</li>
  <li>System Logs Tabellen (Action Log)</li>

  <li>Unbenutzte (veraltete) Tabellen data, config_client, config, lang_bereich, lang_key, lang_value</li>
  <li>Comments (wenn Modul comment installiert) und weitere selbst oder von Plugins angelegte Tabellen</li>
</ul>

<p>Das Directory auf dem Webserver  f&uuml;r den gelöschten Client<br>
  m&uuml;sste per ftp-Tool oder von der Kommandozeile aus gel&ouml;scht werden, 
	um den Mandanten noch vollst&auml;ndiger zu entfernen.</p>
<p>Zu Tabellen siehe auch <a href="http://www.contenido.org/forum/viewtopic.php?t=4600&highlight=conkeywords">Kurzbeschreibung</a> und <a href="http://www.contenido.org/opensourcecms/de/upload/pdf/contenido.db.model.pdf">Datenbankschema.</a></p>
<?php
!isset($sim) ? $simulate = false : $simulate = true ; //default: simulate
$SessID = $sess->id;
$cinuse= $cfg["tab"]["inuse"];
$cnews= $cfg["tab"]["news"];
$cnews_rcp=$cfg["tab"]["news_rcp"];
$ccontent=$cfg["tab"]["content"];
$ccontainer=$cfg["tab"]["container"];
$clink=$cfg["tab"]["link"];
$clients_lang=$cfg["tab"]["clients_lang"];
$ccode = $cfg["tab"]["code"];
$cart_lang=$cfg["tab"]["art_lang"];
$cart=$cfg["tab"]["art"];
$cart_spec=$cfg["tab"]["art_spec"];
$ccat=$cfg["tab"]["cat"];
$ccatart=$cfg["tab"]["cat_art"];
$ccatlang=$cfg["tab"]["cat_lang"];
$cstat=$cfg["tab"]["stat"];
$cstatarchive=$cfg["tab"]["stat_archive"];
$cclients=$cfg["tab"]["clients"];
$cmetatag= $cfg["tab"]["meta_tag"];
$ccontainerconf=$cfg["tab"]["container_conf"];
$ctplconf=$cfg["tab"]["tpl_conf"];
$ctpl=$cfg["tab"]["tpl"];
$clay=$cfg["tab"]["lay"];
$cmod=$cfg["tab"]["mod"];

$crights=$cfg["tab"]["rights"];
$clang=$cfg["tab"]["lang"];
$ckeywords=$cfg["tab"]["keywords"];




$cuser_prop=$cfg["tab"]["user_prop"];
$cgroup_prop=$cfg["tab"]["group_prop"];
$cfrontendusers=$cfg["tab"]["frontendusers"];
$cfrontendpermissions=$cfg["tab"]["frontendpermissions"];
$cfrontendgroupmembers=$cfg["tab"]["frontendgroupmembers"];
$cfrontendgroups=$cfg["tab"]["frontendgroups"];
$cnews_groupmembers=$cfg["tab"]["news_groupmembers"];
$cnews_groups=$cfg["tab"]["news_groups"];


$cproperties=$cfg["tab"]["properties"];
$cdbfs=$cfg["tab"]["dbfs"];
$cupl=$cfg["tab"]["upl"];
$cmod_translations=$cfg["tab"]["mod_translations"];
$cmod_history=$cfg["tab"]["mod_history"];
$cplugins=$cfg["tab"]["plugins"];
$ccommunications=$cfg["tab"]["communications"];


$sql = "SELECT * FROM ".$cclients." ORDER BY idclient ASC";

$db->query($sql);
while ($db->next_record()) {
    $ArrClients[$db->f("idclient")] = $db->f("name");
}
//$form wird 20 zeilen weiter unten benutzt
$form['table'] = '<table><tr><td width="220" align="right">%s</td><td>%s</td></tr><table>';

$form['header'] = '<select name="%s">'."\n";
$form['footer'] = '</select>';

$form['select'] = '<option value="%s"%s>%s (ID = %s)</option>'."\n";
$form['selected'] = ' selected="selected"';


if (is_array($ArrClients)) {
    foreach ($ArrClients as $key => $value) {
        if ($key == $old_idclient)
            $form['source'] .= sprintf($form['select'], $key, $form['selected'], $value, $key);
        else
            $form['source'] .= sprintf($form['select'], $key, "", $value, $key);

    }
}

$stop = false;

if (!isset($old_idclient) ) {
    echo "Bitte wählen Sie...";
    $stop = true;
}

if ($stop) {

    echo '<form action="'.$PHP_SELF.'">'."\n";
    echo '<input type="hidden" name="contenido" value="'.$SessID.'">'."\n";
    $chksim = 'Nur Simulation <input name="sim" type="checkbox" value="on" checked>';
    echo sprintf($form['table'], "CLIENT:" ,sprintf($form['header'],"old_idclient").$form['source'].$form['footer']);
    echo sprintf($form['table'], $chksim , '<input type="submit" name="submit" value="L&ouml;schen!">');

    echo '</form>'."\n";

    page_close();
    die();
}

$old_client_Name="";

/* Ermittle Kundennamen und prüfe die Gültigkeit der idclient-Nummern */
$sql = "SELECT name, idclient, frontendpath from ".$cclients." WHERE (idclient=".$old_idclient.")";

$db->query($sql); /* liefert Zeiger auf Ergebnisliste (Result Set)*/
while ($db->next_record())
{
    if ($db->f("idclient")==$old_idclient) {
			$old_client_Name=trim($db->f("name"));
			$frontendpath = trim($db->f("frontendpath"));
			}
}
if ($old_client_Name=="")
{
    /* Irgendwas stimmt nicht. vermutlich sind die verwendeten idclient-Nummern falsch */
    $Meldung="Zu dem verwendeten Mandantennummern (idclient) ".$old_idclient. " gibt es keinen Mandanten-Namen. Überprüfen Sie die Mandanten-Nummer (idclient) in Ihrem Script. Die Ausführung wird abgebrochen.";
    echo "<hr><h3 class='red'>Fehler: <BR>".$Meldung."</h3><hr>";
    page_close();
    die(); /* Scriptausführung abbrechen */
}

echo "<h3 class='grey'>Ermittlung der Spracheinstellung des Clients/Mandanten...</h3>";

$sql = "SELECT * from ".$clients_lang." WHERE (idclient=".$old_idclient.")";

$db->query($sql);
$merk_idlang_old=0;

while($db->next_record())
{
    if ($db->f("idclient")==$old_idclient) $merk_idlang_old=$db->f("idlang"); 
		/*Merke hier die SprachID des alten Mandanten */
		/*Nicht benutzt*/
} /* End While */

/* echo "<h3 class='darkgrey'>Sprach-ID des Mandanten: idlang = ".$merk_idlang_old."</h3>"; */

/* Alles OK....leg los */
    /* Nun die Baum-Struktur der Kategorien neu aufbauen ??? (steht in Tabelle con_cat_tree) */
		/* Wirklich erforderlich für Löschvorgang? Fürs Kopieren, ja! - knb 20051010*/
		if ($simulate){//aus globaler form variable
         echo "<hr><h1 class='darkgrey'>Simulationsmodus: L&ouml;sche den Mandanten >".$old_client_Name."< (idclient ".$old_idclient."):</h1><hr>";
		} else {
         echo "<hr><h1 class='red'>L&ouml;sche den Mandanten >".$old_client_Name."< (idclient ".$old_idclient."):</h1><hr>";
		}

echo "<h1 class='red'>START</h1>";

    $sql = "    DELETE     FROM ". $cinuse;
    executeSQL($sql, "Entsperre ALLE Objekte, Tabelle $cinuse", "Alle Objekte entsperrt");

    $sql = "    DELETE     FROM ". $ccode. " where idclient = $old_idclient ;";
    executeSQL($sql, "L&ouml;sche Code aus Cache..., Tabelle $ccode", "Cache geleert");

    
    $sql = "    DELETE     FROM " . $cstat . " where idclient = $old_idclient  ";
    executeSQL($sql, "L&ouml;sche Statistiktabellen,Tabellen $cstat", "Statistiktabelle $cstat geleert");
    $sql = "    DELETE     FROM " . $cstatarchive . " where idclient = $old_idclient; ";		
    executeSQL($sql, "L&ouml;sche Statistiktabellen,Tabelle $cstatarchive", "Statistiktabelle $cstatarchive geleert");

   // Newsletter löschen, Newsletter recipients
    $sql = <<<SQL
		/* DELETE $cnews.*
		FROM $cclients INNER JOIN $cnews ON $cclients.idclient = $cnews.idclient
		WHERE ((($cclients.idclient)=$old_idclient));*/
		
		DELETE $cnews.* FROM $cclients , $cnews WHERE $cclients.idclient = $cnews.idclient AND $cclients.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Newsletter für Mandanten..., Tabelle ".$cnews, "Newsletter gel&ouml;scht"); 
		
		$sql = <<<SQL
		/* DELETE $cnews_rcp.*
		FROM $cclients INNER JOIN $cnews_rcp ON $cclients.idclient = $cnews_rcp.idclient
		WHERE ((($cclients.idclient)=$old_idclient)) */
		
		DELETE $cnews_rcp.* FROM $cclients ,  $cnews_rcp WHERE $cclients.idclient = $cnews_rcp.idclient AND $cclients.idclient=$old_idclient ;

SQL;
	  executeSQL($sql, "L&ouml;sche Newsletter Recipients für Mandanten..., Tabelle $cnews_rcp", "Newsletter Recipients gel&ouml;scht");  


/*****************************************************************************************/
    $sql = <<<SQL
    DELETE $ccommunications.*
    FROM $ccommunications
    WHERE ((($ccommunications.idclient)=$old_idclient));
SQL;
    executeSQL($sql, "L&ouml;sche Communications Tabelle ".$cproperties, "Communications Tabelle gel&ouml;scht");  

/* Tabellen die idClient als FK haben */
//Properties
    $sql = <<<SQL
    DELETE $cproperties.*
    FROM $cproperties
    WHERE ((($cproperties.idclient)=$old_idclient));
SQL;
    executeSQL($sql, "L&ouml;sche Properties..., Tabelle ".$cproperties, "Properties gel&ouml;scht");  

//DB Filesystem Einträge
    $sql = <<<SQL
    DELETE $cdbfs.*
    FROM $cdbfs
    WHERE ((($cdbfs.idclient)=$old_idclient));
SQL;
    executeSQL($sql, "L&ouml;sche DB Filesystem Einträge, Tabelle ".$cdbfs, "DB Filesystem Einträge gel&ouml;scht");  

//Uploads
    $sql = <<<SQL
    DELETE $cupl.*
    FROM $cupl
    WHERE ((($cupl.idclient)=$old_idclient));
SQL;
    executeSQL($sql, "L&ouml;sche Uploads..., Tabelle ".$cupl, "Uploads gel&ouml;scht");  

//Plugins
    $sql = <<<SQL
    DELETE $cplugins.*
    FROM $cplugins
    WHERE ((($cplugins.idclient)=$old_idclient));
SQL;
    executeSQL($sql, "L&ouml;sche Plugins..., Tabelle ".$cplugins, "Plugins gel&ouml;scht");  

//Artikelspezifikationen		
    $sql = "    DELETE     FROM $cart_spec where client = $old_idclient ;";
    executeSQL($sql, "L&ouml;sche Artikelspezifikationen..., Tabelle $cart_spec", "Artikelspezifikationen gelöscht");

//keywords
    $sql = <<<SQL
/*
DELETE $ckeywords.*
FROM ($crights INNER JOIN $clang ON $crights.idlang = $clang.idlang) INNER JOIN $ckeywords ON $clang.idlang = $ckeywords.idlang
WHERE ((($crights.idclient)= $old_idclient));
*/
DELETE $ckeywords.* 
FROM $crights , $clang , $ckeywords 
WHERE $clang.idlang = $ckeywords.idlang AND $crights.idlang = $clang.idlang AND $crights.idclient= $old_idclient;
SQL;
    // kann recht lange dauern
    executeSQL($sql, "L&ouml;sche Keywords für Sprachversion der Artikel..., Tabelle ".$ckeywords, "Keywords gel&ouml;scht");  

//sprachen
    $sql = <<<SQL
/* DELETE $clang.*
FROM $crights INNER JOIN $clang ON $crights.idlang = $clang.idlang
WHERE ((($crights.idclient)= $old_idclient));*/
DELETE $clang.* FROM $crights ,  $clang WHERE $crights.idlang = $clang.idlang AND $crights.idclient= $old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Sprachen für Artikel..., Tabelle ".$clang, "Sprachen gel&ouml;scht");  

//rechte in Backenduserverwaltung
    $sql = <<<SQL
DELETE $crights.*
FROM $crights
WHERE ((($crights.idclient)= $old_idclient));
SQL;
    executeSQL($sql, "L&ouml;sche Rechte für Objekte..., Tabelle ".$crights, "Backenduserrechte an Objekten gel&ouml;scht");  
/*****************************************************************************************/
/*ARTIKEL L&ouml;schen*/
		
		// Metatags löschen
    $sql = <<<SQL
		/* 
		DELETE $cmetatag.*
		FROM ($cart_lang
		INNER JOIN $cart ON $cart_lang.idart=$cart.idart) 
		INNER JOIN $cmetatag ON $cart_lang.idartlang=$cmetatag.idartlang
		WHERE ((($cart.idclient)=$old_idclient));
		*/
		DELETE $cmetatag.* 
		FROM $cart_lang ,  $cart ,  $cmetatag 
		WHERE $cart_lang.idartlang=$cmetatag.idartlang AND  $cart_lang.idart=$cart.idart AND $cart.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Metatags für Artikel..., Tabelle ".$cmetatag, "Metatags gel&ouml;scht");  

    // lösche Links zu Artikeln
    $sql = <<<SQL
	/*	DELETE $clink.*
    FROM $clink INNER JOIN $cart ON $clink.idart = $cart.idart
    WHERE ((($cart.idclient)=$old_idclient));*/
    DELETE $clink.* FROM $clink ,  $cart WHERE $clink.idart = $cart.idart AND $cart.idclient=$old_idclient;

SQL;
	  executeSQL($sql, "L&ouml;sche Links zu Artikeln..., Tabelle ".$clink, "Links gel&ouml;scht");  

    //Content L&ouml;schen
    $sql = <<<SQL
    /* 
    DELETE $ccontent.*
    FROM ($ccontent 
		INNER JOIN $cart_lang ON $ccontent.idartlang = $cart_lang.idartlang) 
		    INNER JOIN $cart ON $cart_lang.idart = $cart.idart
    WHERE ((($cart.idclient)=$old_idclient)) */
    
    DELETE $ccontent.* FROM $ccontent ,  $cart_lang ,  $cart 
    WHERE $cart_lang.idart = $cart.idart AND $ccontent.idartlang = $cart_lang.idartlang AND $cart.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Texte der Artikel, Tabelle ".$ccontent, "Content gel&ouml;scht");

    /* ermittel alle Einträge des zu L&ouml;schenden Mandanten*/
    //$sql = "DELETE from ".$cart_lang." where idlang = ".$merk_idlang_old."";
    $sql = <<<SQL
    /* DELETE $cart_lang.*
    FROM $cart INNER JOIN $cart_lang ON $cart.idart = $cart_lang.idart
    WHERE ((($cart.idclient)=$old_idclient));*/
    DELETE $cart_lang.* FROM $cart ,  $cart_lang WHERE $cart.idart = $cart_lang.idart AND $cart.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Metadaten der Artikel, Tabelle ".$cart_lang, "Metadaten gel&ouml;scht");  
    
    /* ermittel alle Artikel des zu L&ouml;schenden Mandanten */
    $sql = "DELETE from ".$cart." where idclient=".$old_idclient;
    executeSQL($sql, "L&ouml;sche Artikel, Tabelle ".$cart, "Die Artikel wurden gel&ouml;scht.");
		
    echo "<hr>";


/*****************************************************************************************/
/*  KATEGORIEN L&ouml;schen */
	  // lösche verknüpfungen kategorie => artikel
    $sql = <<<SQL
    /*
    DELETE $ccatart.*
    FROM $cart INNER JOIN $ccatart ON $cart.idart = $ccatart.idart
    WHERE ((($cart.idclient)=$old_idclient)); */
    DELETE $ccatart.* FROM $cart ,  $ccatart WHERE $cart.idart = $ccatart.idart AND $cart.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Zuordnungen der Artikel zu den Kategorien, Tabelle ".$ccatart, "Kategorie-Zuordnungen gel&ouml;scht");

//User-defined Properties, gebunden an cat_lang
    $sql = <<<SQL
    /* 
    DELETE $cuser_prop.*
    FROM ($ccat 
    INNER JOIN $ccatlang ON $ccat.idcat = $ccatlang.idcat) 
    INNER JOIN $cuser_prop ON $ccatlang.idcatlang = $cuser_prop.idcatlang
    WHERE ((($ccat.idclient)=$old_idclient));
    */
    DELETE $cuser_prop.* FROM $ccat ,  $ccatlang ,  $cuser_prop WHERE $ccatlang.idcatlang = $cuser_prop.idcatlang AND $ccat.idcat = $ccatlang.idcat AND $ccat.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche User-defined Properties, Tabelle ".$cuser_prop, "User-defined Properties gel&ouml;scht");

//Group-defined Properties, gebunden an cat_lang		
    $sql = <<<SQL
    /* 
    DELETE $cgroup_prop.*
    FROM ($ccat 
    INNER JOIN $ccatlang ON $ccat.idcat = $ccatlang.idcat) 
    INNER JOIN $cgroup_prop ON $ccatlang.idcatlang = $cgroup_prop.idcatlang
    WHERE ((($ccat.idclient)=$old_idclient)); */
    DELETE $cgroup_prop.* 
    FROM $ccat ,  $ccatlang ,  $cgroup_prop 
    WHERE $ccatlang.idcatlang = $cgroup_prop.idcatlang AND $ccat.idcat = $ccatlang.idcat AND $ccat.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Group-defined Properties, Tabelle ".$cgroup_prop, "Group-defined Properties gel&ouml;scht");


    /* Nun müssen die Bezeichnungen der Kategorien gel&ouml;scht werden (steht in Tabelle con_cat_lang) */
    $sql = <<<SQL
	/*	DELETE $ccatlang.*
		FROM $ccat 
		INNER JOIN $ccatlang ON $ccat.idcat=$ccatlang.idcat
		WHERE ((($ccat.idclient)=$old_idclient)); */
	DELETE $ccatlang.* FROM $ccat ,  $ccatlang WHERE $ccat.idcat=$ccatlang.idcat AND $ccat.idclient=$old_idclient;

SQL;
		
    executeSQL($sql, "L&ouml;sche Kategoriebezeichnungen , Tabelle ".$ccatlang, "Die Kategoriebezeichnungen wurden gel&ouml;scht.");
	
  
    /* lese aus der Tabelle con_cat alle Kategorien des zu L&ouml;schenden Mandanten ($old_idclient) aus */
    $sql = "DELETE from ".$ccat." where idclient=".$old_idclient;
    executeSQL($sql, "L&ouml;sche die Kategorien/Men&uuml;s, Tabelle ".$ccat, "Die Kategorien wurden gel&ouml;scht.");
    

    /* Nun die Baum-Struktur der Kategorien neu aufbauen ??? (steht in Tabelle con_cat_tree) */
		/* Wirklich erforderlich für Löschvorgang? Fürs Kopieren, ja! - knb 20051010*/
   echo "<hr><h2 class='red'>--Neuaufbau Tabelle *Cat_Tree (betrifft ALLE Mandanten)</h2><hr>"; /* Contenido Funktion in includes\functions.str.php */

		if ($simulate){//aus globaler form variable
     		echo "<h3 class='blue'>--Simulationsmodus  strRemakeTreeTable() </h3>";
         echo "<h3 class='blue'>--Die Funktion strRemakeTreeTable() aus functions.str.php wurde NICHT ausgeführt</h3> (schreibt die Tabelle con_cat_tree neu für die Navigation/Baumstruktur)";
		} else {
        strRemakeTreeTable(); /* Contenido Funktion in includes\functions.str.php */
        echo "<h3 class='red'>Die Funktion strRemakeTreeTable() aus functions.str.php wurde ausgeführt</h3> (schreibt die Tabelle con_cat_tree neu für die Navigation/Baumstruktur)";
		}
    echo "<h3>--Neuaufbau von *Cat_Tree abgeschlossen</h3>"; /* Contenido Funktion in includes\functions.str.php */
/*****************************************************************************************/
/*CONTAINER L&ouml;schen - sollte passieren bevor templates gelöscht werden*/

    /*CONTAINER CONF L&ouml;schen -  */
  
    $sql = <<<SQL
			/* DELETE $ccontainerconf.*
		FROM ($ctpl 
		INNER JOIN $ctplconf ON $ctpl.idtplcfg = $ctplconf.idtplcfg) 
		INNER JOIN $ccontainerconf ON $ctplconf.idtplcfg = $ccontainerconf.idtplcfg
		WHERE ((($ctpl.idclient)=$old_idclient));*/
	DELETE $ccontainerconf.* FROM $ctpl ,  $ctplconf ,  $ccontainerconf 
	WHERE $ctplconf.idtplcfg = $ccontainerconf.idtplcfg 
	AND $ctpl.idtplcfg = $ctplconf.idtplcfg AND $ctpl.idclient=$old_idclient;

SQL;

    executeSQL($sql, "L&ouml;sche die Container Config f&uuml;r Templates, Tabelle ".$ccontainerconf, "Container Confs wurden gel&ouml;scht.");    

    
/* Die Container sind nur an den Index der Templates gebunden, nicht direkt an die idClient, also nicht direkt an den Mandanten */
   
    $sql = <<<SQL
	/*		DELETE $ccontainer.* 
			FROM $ccontainer 
			INNER JOIN $ctpl ON $ccontainer.idtpl = $ctpl.idtpl
				WHERE ((($ctpl.idclient)=$old_idclient));
	*/
	DELETE $ccontainer.* FROM $ccontainer ,  $ctpl WHERE $ccontainer.idtpl = $ctpl.idtpl AND $ctpl.idclient=$old_idclient;

SQL;
			
    executeSQL($sql, "L&ouml;sche die Container, Tabelle ".$ccontainer, "Die Container wurden gel&ouml;scht.", "Die Bezeichnungen der Kategorien wurden gel&ouml;scht.");        

/*****************************************************************************************/
/*TEMPLATES L&ouml;schen*/
  
    $sql = <<<SQL
	/*	DELETE $ctplconf.*
		FROM ($cclients 
		INNER JOIN $ctpl ON $cclients.idclient = $ctpl.idclient) 
		INNER JOIN $ctplconf ON $ctpl.idtplcfg = $ctplconf.idtplcfg
		WHERE ((($cclients.idclient)=$old_idclient));		*/
	
	DELETE $ctplconf.* FROM $cclients ,  $ctpl ,  $ctplconf 
	WHERE $ctpl.idtplcfg = $ctplconf.idtplcfg AND $cclients.idclient = $ctpl.idclient AND $cclients.idclient=$old_idclient;
		
SQL;
    executeSQL($sql, "L&ouml;sche Templates-Konfiguration, Tabelle ". $ctplconf, "Templates-Konfigurationen gel&ouml;scht"); 
    
    
    /* Lösche nun die Daten der Tabelle con_Templates */
    $sql = "DELETE from ".$ctpl." where idclient=".$old_idclient."";
    executeSQL($sql, "L&ouml;sche Templates, Tabelle ". $ctpl, "Templates gel&ouml;scht"); 
    
   
    
/*****************************************************************************************/
/*LAYOUTS L&ouml;schen*/
    $sql = "DELETE from ".$clay." where idclient=".$old_idclient;
    executeSQL($sql, "L&ouml;sche Layouts, Tabelle ". $clay, "Layouts gel&ouml;scht"); 

/*****************************************************************************************/
/*Module L&ouml;schen*/
/* ermittel alle Module des zu L&ouml;schenden Kunden */
    $sql = <<<SQL
	/*	DELETE $cmod_translations.*
		FROM $cmod INNER JOIN $cmod_translations ON $cmod.idmod = $cmod_translations.idmod
		WHERE ((($cmod.idclient)=$old_idclient));*/
	DELETE $cmod_translations.* 
	FROM $cmod ,  $cmod_translations 
	WHERE $cmod.idmod = $cmod_translations.idmod AND $cmod.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Module Translations, Tabelle $cmod_translations" , "Module Translations gel&ouml;scht");     

    $sql = "DELETE $cmod_history.* FROM $cmod_history WHERE ((($cmod_history.idclient)=$old_idclient))";
    executeSQL($sql, "L&ouml;sche Module History, Tabelle ". $cmod_history , "Module History gel&ouml;scht");     

    $sql = "DELETE from ".$cmod." where idclient=".$old_idclient;
    executeSQL($sql, "L&ouml;sche Modules, Tabelle ". $cmod, "Modules gel&ouml;scht");     

/* ############################################################## */
  $sql = <<<SQL
    /* DELETE $cnews_groupmembers.*
    FROM $cnews_groupmembers INNER JOIN $cnews_groups ON $cnews_groupmembers.idnewsgroup = $cnews_groups.idnewsgroup
    WHERE ((($cnews_groups.idclient)=$old_idclient));*/
    DELETE $cnews_groupmembers.* 
    FROM $cnews_groupmembers ,  $cnews_groups 
    WHERE $cnews_groupmembers.idnewsgroup = $cnews_groups.idnewsgroup AND $cnews_groups.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Newsletter Group Members , Tabelle ". $cnews_groupmembers , "Newsletter Group Members gel&ouml;scht");     

    $sql = <<<SQL
    DELETE $cnews_groups.*
    FROM $cnews_groups
    WHERE ((($cnews_groups.idclient)=$old_idclient));
SQL;
    executeSQL($sql, "L&ouml;sche Newsletter Groups, Tabelle ". $cnews_groups , "Newsletter Groups gel&ouml;scht");  			 


//idclient aus frontend* tabellen rauslöschen

    $sql = <<<SQL
    /* DELETE $cfrontendpermissions.*
    FROM $cfrontendgroups 
    INNER JOIN $cfrontendpermissions ON $cfrontendgroups.idfrontendgroup = $cfrontendpermissions.idfrontendgroup
    WHERE ((($cfrontendgroups.idclient)=$old_idclient));*/
    
    DELETE $cfrontendpermissions.* 
    FROM $cfrontendgroups ,  $cfrontendpermissions 
    WHERE $cfrontendgroups.idfrontendgroup = $cfrontendpermissions.idfrontendgroup AND $cfrontendgroups.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Frontend Permissions, Tabelle ". $cfrontendpermissions , "Frontend Permissions gel&ouml;scht");     

    $sql = <<<SQL
    /* DELETE $cfrontendgroupmembers.*
    FROM $cfrontendgroupmembers INNER JOIN $cfrontendusers ON $cfrontendgroupmembers.idfrontenduser = $cfrontendusers.idfrontenduser
    WHERE ((($cfrontendusers.idclient)=$old_idclient));*/
    DELETE $cfrontendgroupmembers.* 
    FROM $cfrontendgroupmembers ,  $cfrontendusers 
    WHERE $cfrontendgroupmembers.idfrontenduser = $cfrontendusers.idfrontenduser AND $cfrontendusers.idclient=$old_idclient;

SQL;
    executeSQL($sql, "L&ouml;sche Frontend Group Members , Tabelle ". $cfrontendgroupmembers , "Frontend Group Members gel&ouml;scht");     
		
    $sql = <<<SQL
    DELETE $cfrontendgroups.*
    FROM $cfrontendgroups
    WHERE ((($cfrontendgroups.idclient)=$old_idclient));
SQL;
    executeSQL($sql, "L&ouml;sche Frontend Groups, Tabelle ". $cfrontendgroups , "Frontend Groups history gel&ouml;scht");  			 

    $sql = <<<SQL
    DELETE $cfrontendusers.*
    FROM $cfrontendusers
    WHERE ((($cfrontendusers.idclient)=$old_idclient));
SQL;
    executeSQL($sql, "L&ouml;sche Frontendusers, Tabelle ". $cfrontendusers , "Frontendusers gel&ouml;scht");     

  
	
/*****************************************************************************************/
/* Client löschen L&ouml;schen*/
  
    $sql = "DELETE from ".$cclients." where idclient=".$old_idclient;
    executeSQL($sql, "L&ouml;sche CLIENT ". $cclients, "Client gel&ouml;scht");     


    //echo "<p class='darkgrey'>Es wurden alle Sprachen, Nutzerrechte an Objekten, Newsletter, Links, Newsletter-Recipients, Metatags, Artikel, Kategorien, Container, Templates, Layouts, und Module gel&ouml;scht.";
		//echo "<br>Und natürlich der Client selbst.<br>";
	    echo "<h1 class='red'>FERTIG</h1>";
	    echo "<h3 class='grey'>Das Directory <br>$frontendpath<br>auf dem Webserver wurde nicht gelöscht. <br>
     Es sollte m&ouml;glicherweise  per ftp-Tool oder von der Kommandozeile aus gel&ouml;scht werden.</h3>";

?>
</body>
</html>
<?php
// simple function to wrap redundant things up
function executeSQL($sql=false, $msg1, $msg2) {
    global $db, $cfg, $simulate;
    if ($sql) {
			echo "<hr><h2 class='grey'>--$msg1</h2><hr>\n";
			//echo SQl if simulate is checked 
			if ($simulate){//aus globaler form variable
			  echo "<h3 class='grey'>--Simulationsmodus<br>$sql</h3>\n";			
			} else {
				$db->query($sql); 
				echo "<h3 class='blue'>Ausgeführt: $sql</h3>\n";			  
			}

			$err = mysql_error();
			if($err == ''){
				echo "<h3 class='blue'>--$msg2</h3>\n";
			} else {
				echo "<h3 class='red'>--FAILURE of SQL<br>$sql<br> DB said:<br>$err</h3>\n";
				$err="";
			}
			//echo "<h1><font color='#0055dd'>--...Done.</font></h1>";
		}
}
?>

Zuletzt geändert von knb am Mi 24. Mai 2006, 11:48, insgesamt 3-mal geändert.
Gruss,
Knut

HorstWetzel
Beiträge: 15
Registriert: Di 17. Jan 2006, 11:47
Kontaktdaten:

Beitrag von HorstWetzel » Di 23. Mai 2006, 08:01

Hallo Knut

ich probiere gerade dein Script deleteclient aus. Das soll ja lauffähig sein. Allerdings verwende ich hier die Version 4.6.4.
Bei der Ausführung erhalte ich jedoch einen Parse Error in Line 333. Dort steht eine Anweisung
// ab hier werden Parse - Errrors erzeugt!
$sql = <<<SQL
DELETE $cnews.*
FROM $cclients INNER JOIN $cnews ON $cclients.idclient = $cnews.idclient
WHERE ((($cclients.idclient)=$old_idclient));
SQL;
executeSQL($sql, "L&ouml;sche Newsletter für Mandanten..., Tabelle ".$cnews, "Newsletter gel&ouml;scht");

ich bin kein Experte in php, aber diese Anweisung verstehte ich nun gar nicht, zumal bis dahin eine völlig andere Syntax verwendet wurde.

Liegt dies jetzt an den unterschiedlichen Versionen oder ist die heir wirklich noch ein unvollendeter Code, der noch überarbeitet werden muss?

Ich versuche nämlich gerade einen neuen Mandanten anzulegen, der auf den gleichen Standards basiert wie unser Mandat 1, aber immer wieder bekomme ich schon Probleme, wenn ich zu dem neu angelegten Mandaten eine Sprache definieren will. Die Sprache "deutsch" ist jedoch schon definiert. Wie kann ich nun die gleiche Sprache auch für den Mandanten 2 benutzen? In der Administration kann ich für einen neuen Mandanten immer nur neue Sprache definieren, aber das macht dow wohl wirklich keine Sinn , oder ?

Gruss

Horst Wetzel

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Di 23. Mai 2006, 11:32

Hallo Horst,

Es hat wohl nichts mit der Contenido Version zu tun.
Wahrscheinlich benutzt Du mysql 3.23. Dieses Release kommt mit der verwendete INNER JOIN Syntax nicht klar (die Tabelle news ist die erste Tabelle vom Script die per Join von verknüpften Datesätzen befreit wird, die Statements zuvor greifen nur auf einzelen Tabellen zu, sieh selbst). Ist zwar SQL Standard, aber mysql 3.23 unterstützte es nicht.

Siehe auch Kommentar im Scriptheader.



Man müsste die SQL statements umschreiben aber das ist mir zu aufwendig da mysql 3.23 nicht mehr so viel verwendet wird. Abwärtskompatibilität hat Grenzen.

Die Syntax ist anders da auf die mysql Tabellen direkt zugegriffen wird. Das Script weist auch darauf hin.
Daher muss man auch contenido sysadmin sein um es zu benutzen.

Dein Problem mit der Sprache versteh ich gerade nicht, das kann vielleicht jemand anders beantworten.
Gruss,
Knut

HorstWetzel
Beiträge: 15
Registriert: Di 17. Jan 2006, 11:47
Kontaktdaten:

Beitrag von HorstWetzel » Di 23. Mai 2006, 13:17

Hallo Knut

Wenn ich dich richtig verstanden habe sollte dieser Code also so unter der von mir eingesetzten Version 4.0.12 von mySQL funktionieren ?

Aber was ist das für eine PHP - Syntax "$sql = <<<SQL ..." ?

Kannst du mir vielleicht eine Stelle nennen, woch das mal nachlesen kann? Ich möchte ja nur gerne wieder etwas dazulernen und herausfinden, warum ich hier eine Fehlermeldung bekomme.


Gruss

Horst

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Di 23. Mai 2006, 14:20

Dieses <<<SQL Konstrukt nennt sich "Here Document" und sollte unter diesem Stichpunkt in jedem Buch über Shell-Programmierung beschrieben sein.
Oder Google: "Here Document" PHP

Es ermöglicht das komfortable Eingeben langer Multiline-Strings im Programmcode.

Auch PHP bietet seit PHP 4, glaub ich, diese Here-Document Syntax an, nur eben mit den 3 < Zeichen und nicht wie sonst in Perl oder Shellscript üblich mit zweien.


Hm du sagst, auch Mysql 4.0.12 verschluckt sich an der INNER JOIN Syntax? Komisch, also ich habe 4.1 und da gehts auf jeden Fall.

Hatte noch kein Feedback erhalten zum Script.

Vielleicht sollte ich die Statements doch umschreiben sodass die Join-Bedingung in der Where - Klausel steht.
Es sind nur so viele Statements! Mal sehen ob ich ein Tool dafür finde.
Kann also ne Weile dauern, da ich noch anderes zu tun habe.
Gruss,
Knut

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Di 23. Mai 2006, 17:35

Habe es jetzt doch umgeschrieben und die INNER JOIN Syntax in delete statements ersetzt durch komplexe WHERE Klauseln... es geht trotzdem nicht für mysql 3.23.

Habe noch mal recherchiert, hier vorläufig zur Doku:
Es sind anscheinend mehrere Dinge der von mir verwendeten SQL Syntax die nur bedingt abwärtskompatibel sind:

(ansi-sql) INNER JOIN im SELECT statement: ab mysql 3.23.26

INNER JOIN im DELETE statement, genauer in FROM klausel eines DELETE statements: ab mysql 4.1 (?)

multiple-table delete (DELETE tab1.* FROM tab1,tab2 WHERE tab1.pk = tab2.pk): ab mysql 4.0.0.
Zuletzt geändert von knb am Mi 24. Mai 2006, 09:28, insgesamt 1-mal geändert.
Gruss,
Knut

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Di 23. Mai 2006, 19:43

knb hat geschrieben:Dein Problem mit der Sprache versteh ich gerade nicht, das kann vielleicht jemand anders beantworten.
Ich weiss nicht, ob ICH es richtig verstanden habe, aber wenn die Frage lautet, ob man fuer jeden Mandanten die Sprache "Deutsch" angelegt werden muss, falls mehrere Mandanten deutschsprachige Inhalte haben, dann lautet die Antwort "ja", weil die Sprache Deutsch von Mandant 1 fuer Mandant 2 unsichtbar ist.
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mi 24. Mai 2006, 11:07

Um es anders zu formulieren: So verrückt es klingt, man muss pro Mandant deutsch wieder aufs Neue definieren (und erhält entsprechend höhere IDs). Im ersten Augenblick macht es keinen Sinn (da eine Sprache als global aufgefasst werden kann), im zweiten Blick wird die Ursache ersichtlich: Mandanten sind komplett voneinander getrennt. Daher ist die Sprache getrennt zu definieren.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

jacke
Beiträge: 303
Registriert: Mi 25. Sep 2002, 19:37
Kontaktdaten:

Beitrag von jacke » Fr 6. Okt 2006, 11:27

Hallo,

da ich es nicht überblicke - geht das skript auch für die 4.6.8.5 Version?

gruß
jacke

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Fr 6. Okt 2006, 11:36

jacke hat geschrieben:da ich es nicht überblicke - geht das skript auch für die 4.6.8.5 Version?
Das kann sein, allerdings würde ich einfach auf die neue Version warten. Mit der sollte es auf "klassischem" Wege möglich sein, Mandanten zu löschen.

jacke
Beiträge: 303
Registriert: Mi 25. Sep 2002, 19:37
Kontaktdaten:

Beitrag von jacke » Fr 6. Okt 2006, 11:58

nun die sicher erwartete Frage: Wann ist es denn so weit?

jacke

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Fr 6. Okt 2006, 12:15

jacke hat geschrieben:nun die sicher erwartete Frage: Wann ist es denn so weit?
Und die altbekannte Antwort: when it's done! Soll aber relativ bald geschehen.

Gesperrt