Programmierung – VBA in Excel mit ein wenig WTF

Pivot Tabellen, VBA Scripte und Programmierung in Excel. Das macht alles so unbeschreiblich viel spaß. Das man meinen könnte man sollte Spaß neu definieren so das man unter Spaß ab sofort folgendes versteht.

Spaß ist,

  • unlogische Abläufe in einer ständig meckernden Umgebung abzubilden.
  • als Antwort nur unverständliches kryptisches Gebrabbel zu bekommen.
  • Masochistisch veranlagt sein.
  • man nach 2 Tagen festzustellen das es da irgendwo doch einen einfacheren Weg gibt. (Zettel/Stift)

Spaß ist was anderes!

Fertig erstellte Berichte in Excel zu übernehmen nur weil man nochmal an den Zahlen drehen möchte ohne die eigentlichen Zahlen zu verändern. Das hat für mich so den Eindruck als wolle man nochmal an der Statistik drehen und sich das ganze schön rechnen aber Auftrag ist nun mal Auftrag.

Pivot Tabellen. Pivot Tabellen, so etwas abartiges. Aber im Allgemeinen ist Excel an sich ja schon Grausam genug. Wenn da nicht auch diese komische VBA währe, es Hinterlässt bei mir den Eindruck als müsste ich mich gründlich Waschen, sehr sehr gründlich. Da bekomme ich glatt Waschzwang.

Dieses ganze Zeug ist einfach nur grausam. Grausam ohne Ende.

Programmierung – Sharepoint aus der Hölle

Eigentlich wollte ich einige Hass Tiraden, auf die Art und Weise wie Microsoft denkt, dass das Web arbeitet, los lassen. Aber ums ehrlich zu sagen eher sollte man mit diesen Leuten Mitleid haben. Nicht das C# vom Codestyle her echt schön ist (hab schon grausamere Sprachen gesehen). Aber was die Leute von Microsoft geritten haben muss, um Sharepoint so Unfreundlich zu gestalten, und Vor allem so Unanpassbar so schecklich.

Nicht das ich mich auch im entferntesten mit Sharepoint wirklich auskenne, aber das was ich gesehen habe reicht mir um so etwas wie Pure Abneigung zu empfinden. Und an dieser Stelle werde ich immer all Diejenigen auslachen die da behaupten das man mit Sharepoint Easy und ohne aufwand das erreichen kann was man will und auch braucht. Nein ganz und gar nicht. Ich bin ungefähr 10 mal schnell mit PHP/HTML5/JQuery als mit Sharepoint/C# Wenn es darum geht effektiv Daten zu manipulieren. Wenn es darum geht nur irgendwelchen Müll zusammen zu klicken dann bitte nehmt Sharepoint für her.

Aber das mir Sharepoint Berater nicht mal erklären können warum man in eine im Browser laufenden Anwendung kein Jquery UI einbinden, und die Styling Eigenschaften sowie Callings von Jquery nicht global machen kann. (Jedenfalls hab ich dazu bisher nix gefunden, geht wahrscheinlich irgendwo, Fehlt dem Sharepoint wahrscheinlich nur an irgendeine verfickten stelle irgendeine verwixxte Berechtigung). Warum man kryptische Eigenschaften über Zich elemente Schleifen muss anstelle einer Zentralen Datenstelle bleibt mir schleierhaft.

Warum man die alten onClick Eigenschaften auf die Elemente direkt schreibt anstelle diese in Extra JS code auszulagern ist mir schleierhaft. Aber hej, immerhin beherscht Sharepoint hervorragende Divsuppe, garniert mit ich packe alles in Tabellen! Jey ob das Sinn ergibt oder nicht ist doch ej Wurst. Packen wir noch ein paar eigens generierte ID und andere Attribute dazu. Das ganze gepaart mit ihrer hauseigenen ASPX Soße und fertig ist etwas das wie HTML aussieht aber kein HTML ist. Etwas das wie XML mit einer XLST aussieht aber kein echtes XML ist (Es sei denn man bemüht sich selbst um die XML/XLST).

Mal von dem beschissenen Overhead abgesehen. Wir bei uns setzten Sharepoint zur Zeiterfassung ein. Es verlangt an der stelle eine Rechenerkennungsanmeldung über das Microsoft Netzwerk als Webseite.

Aber das ist noch nicht mal das schlimmste. Das schlimmste für mich ist ich bin PHP5/HTML5/MYSQL CSS/JQUERY Entwickler. Ich kann hervorragend Schlanken HTML5 schreiben. Dazu CSS von mir aus in LESS oder SASS gepaart mit Steuerungslogik in Jquery. Mit dem Richtigen Konzept geht das in Stunden wenn ich richtig Motiviert bin.

Ich hab letzte Woche, Weil es ja die Zukunft ist (Persönlich halte ich Sharepoint für eine noch schlimmere Totgeburt als Vista und Windows 8) jedes mal wenn ich diesen Satz höre möchte ich weinen. Wie kann eine Software die Ein so inkonsequentes Rechtemanagement hat die Zukunft sein. Wie kann eine Software die HTML-quellcode vergewaltigt und misshandelt. Überhaupt von den Gängigen Browsern Unterstützung finden. Ein 30 Fach verschachteltes DIV war schon vor Sharepoint Schlechter Style und wird es auch bleiben. 7 fach verschachtelte Tabellen sind Böse und werden das auch immer bleiben. Egal wie sehr man das gesamte CSS in Weiß und ja nix mit verlauf verfrachtet. Schlechtes HTML bleibt schlechtes HTML und wenn die Renderer der Browser sich teilweise selbst zusammenreimen müssen was das ganze Soll macht es da auch nicht besser. 🙂 Aber HTML in schlecht konnte MS schon seit Frontpage ja schon sehr gut 🙂

Nein viel schlimmer ist da eigentlich das Microsoft mit Sharepoint eine Speicherlogik fährt die für jeden echten Tabellen Designer (SQL Versteher) im Quadrat kotzen lässt, und zwar Einhörner gepaart mit Nudel Suppe. Egal was es ist und wie es aufgebaut wird es landet alles in irgendeiner Hashwert gefickten Tabelle mit Blobfeld wo Daten anhand des Hashes verschlüsselt vorliegen. O_o? Ja My direkte Manipulation der Daten wäre auch nicht wünschenswert nich mal über MSSQL. Man kann die Daten nur über die Oberfläche bearbeiten in der sie Erstellt wurden. Ansonsten muss man irgendwelche Verrenkungen veranstalten über irgendwelche gekapselten Klassen die von irgendwo ableiten ohne so recht zu wissen wo nun die Daten genau stecken.

Und für jeden der sich jetzt Fragt warum Heult der hier jetzt so rum.

irgendein Hello World für Sharepoint 2009
MSDN Tutorials für Hello World

PS: hier mal ein Vergleich 🙂

<?php echo 'hello world!'; ?>
<html><body>hello world</body></html>
<script type="text/javascript">
document.write('hello world');
</script>

Diese drei Dinge tun im Grunde das selbe wie die beiden Sharepoint tuts da … Hello World ausgeben 😉 Gut man muss immerhin bei PHP noch wissen wie man einen Apache mit php Installiert. aber ehrlich -> Wamp bei einfachem HTML brauch man nichmal das die gehen so im browser auf. Und javascript muss nur in eine HTML Seite eingebettet werden. Alles keine Hexerei. 😉 Aber M$ konnte ja noch nie in leicht. Weder leicht für Anwender noch leicht für Entwickler. Und kommt mir ja nicht mit .net, ich Arbeite jetzt seit 2005 als Programmierer. 🙂 die 5 Jahre davor zählen nich weil Ausbildung und so.

Aber naja falls wer irgendwo eine halbwegs gute befehlreferenz für c# für Sharepoint 2013 kennt 😉 wäre ich sehr dankbar. So etwas ähnliches wie php.net und kommt mir hier jetzt nicht msdn. MSDN is scheisse hoch drei. Denn was php.net ausmacht sind die Kommentare und die lebendigen Beispiele. Von der Vielfalt bei Jquery/Css und Html5 brauch ich da gar nicht erst anfangen.

Eine Schande Namens Datenbank Design

Ursprünglich wollt ich nur was zu MSSQL sagen aber das währe zu kurz gegriffen, denn auch MSSQL bietet irgendwo seine Vorteile und hat wahrscheinlich in den Augen seiner Schöpfer seine Daseinsberechtigung. Es ist eher der Designer also das Management Studio was mich anwürgt.

Wer schon einmal versucht hat aus diesem Studio heraus ein DB Dump zu machen um eventuell die gesamte Datenbank in ein anderes Format zu schaufeln der weiß wie leidensfähig man sein muss wenn es um MSSQL geht.

Ich hab irgendwann aufgegeben nenn Converter zu suchen und hab mir die Skripte alle selbst geschrieben samt DB Connector. Was mich im Endeffekt nur Minuten gekostet hat.

Will man hingegen nurn Backup machen, läuft die ganze Sache Rechtsklick Sichern … fertig, wieder in MSSQL einspielen sollte da weniger das Problem sein. Wenn der Designer nicht für Masochisten währe ja.

Ein Beispiel gefällig?

mysqldump -u **** -p --no-create-info {databasename} > {path}/{filename}.sql

Man gibt noch eventuell einen Pfad an, oder nicht je nach dem ob man sich schon im Verzeichnis befindet wo man die Datei haben will und man ist schon fast fertig, ein Enter und noch die Eingabe von MySql Password und die gewählte Datenbank ist gedumpt. Simple, Stupide, Einfach. Klar man kann da noch Ewig parameter dran klatschen. Aber fürn einfach Dump reicht das da vollkommen aus.
Und PS. Soll ich euch mal was stecken das würde so sogar unter CMD laufen 😉 man müsste dort nur ins Verzeichnis von MySql Wechseln. Weil er unter windows den dienst so nicht findet ^^ außer man schreibt halt.

C:\>wamp\bin\mysql\mysql5.5.8\bin\mysqldump -u *** -p test > d:\stuff\test.sql

Wer mir nicht glaubt hier ein Auszug des Resultates.

--
-- Table structure for table `test`
--

DROP TABLE IF EXISTS `test`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `test` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `test`
--

Schade das M$Sql sowas nicht kann, jedenfalls ist mir bis Heute nichts dergleichen begegnet. Mal von der Abartigkeit abgesehen sich Wahllos Speicher zu reservieren und ihn einfach nicht wieder frei zu geben. Frei nach dem Motto könnte ja in x Sekunden nochmal das selbe gefragt werden.

Wer beim Schreiben seiner Datenbank Klassen und Der SQL Statements so etwas nicht berücksichtigt, dass häufig die selben Daten angefragt werden und diese nach x Fragen in Zeitraum y nicht von selbst einfach in Speicher läd. Und dann die Daten nicht einfach wieder ausm Arbeitsspeicher holt.
Sondern ständig die Datenbank beackert, gehört sowie so geschlagen und so.

Noch besser sind natürlich, UNION SELECTS über 17 Tabellen! Und ich scherze hier nicht. Genau das hab ich hier nämlich gehabt. ein UNION SELECT über 17 Tabellen. Diese Abfrage war und ist faktisch Defekt by Design!

Und glaubt nicht das die 17 Tabellen alle was mit einander zu tun hatten. NEIN … der Author wollte sich nur die Abfragen sparren und Alles was man zu einem User hohlen kann in eine Abfrage verfrachten, Um so Zeit zu sparren. Also anstelle die Daten dann zu Laden wenn sie WIRKLICH gebraucht werden, wurde einfach alles bei jedem Seiten Load geladen! Ob es gebraucht wird oder nicht.

Yey und irgendwann haben sie sich dann gewundert warum die Seite zum Laden plötzlich Minuten statt Sekunden braucht.

Kleines Beispiel? Das hier ist natürlich verschleiert 😉 Weil wird derzeit noch so eingesetzt. Aber das tut im Grunde nichts anderes, als festzustellen welche Rolle ein User hat. Herrlich oder?

SELECT
	c.idc, 
	c.co, 
	c.theme,
	p.idp, 
	uRoleM.rn, 
	NULL, 
	NULL,
	ul.urm_id, 
	m2.name, 
	c.KD, 
	c.mV, 
	c.mDD, 
	ISNULL(c.scRscR,1), 
	ISNULL(ul.language,ISNULL(c.defaultLanguage,'de_DE'))
FROM 
	co c, 
	Pr p, 
	UL ul, 
	URM uRoleM, 
	Module m2
WHERE 
		c.idc=p.co_id
	AND p.idp=ul.Pr_id
	AND ul.un=''
	AND m2.id=uRoleM.module_id
	AND ul.urm_id=uRoleM.id_role
UNION
SELECT 
	c.idc, 
	c.co, 
	c.theme, 
	p.idp, 
	uRoleM.rn, 
	ummr.rights,
	m.name,
	ul.urm_id, 
	m2.name,
	c.KD,
	c.mV, 
	c.mDD, 
	ISNULL(c.scR,1),
	ISNULL(ul.language,
	ISNULL(c.defaultLanguage,'de_DE'))
FROM 
	co c, 
	Pr p, 
	UL ul,
	URM uRoleM,
	UserManagementModuleRights ummr, 
	Module m, 
	coModuleRights cmr, 
	Module m2
WHERE 
		c.idc=p.co_id
	AND p.idp=ul.Pr_id
	AND ul.un=''
	AND ul.urm_id=uRoleM.id_role
	AND ummr.role_id=uRoleM.id_role
	AND m.id=ummr.module_id
	AND cmr.module_id=ummr.module_id
	AND c.idc=cmr.co_id
	AND m2.id=uRoleM.module_id
GROUP BY 
	c.idc, 
	c.co, 
	c.theme, 
	p.idp, 
	uRoleM.rn, 
	ummr.rights,
	ul.urm_id, 
	m.name, 
	m2.name,
	c.KD,
	c.mV, 
	c.mDD, 
	c.scR, 
	ul.language, 
	c.defaultLanguage
UNION
SELECT 
	c.idc, 
	c.co, 
	c.theme, 
	p.idp, 
	uRoleM.rn, 
	ummr.rights,
	me.extraName,
	ul.urm_id, 
	m2.name,
	c.KD,
	c.mV, 
	c.mDD, 
	ISNULL(c.scR,1), 
	ISNULL(ul.language,
	ISNULL(c.defaultLanguage,'de_DE'))
FROM 
	co c, 
	Pr p, 
	UL ul,
	URM uRoleM,
	UserManagementModuleRights ummr, 
	ModuleExtra me, 
	coModuleRights cmr, 
	Module m2
WHERE 
		c.idc=p.co_id
	AND p.idp=ul.Pr_id
	AND ul.un=''
	AND ul.urm_id=uRoleM.id_role
	AND ummr.role_id=uRoleM.id_role
	AND ummr.extra_id=me.id
	AND cmr.extra_id=ummr.extra_id
	AND c.idc=cmr.co_id
	AND m2.id=uRoleM.module_id
GROUP BY 
	c.idc, 
	c.co, 
	c.theme,
	p.idp, 
	uRoleM.rn, 
	ummr.rights,
	ul.urm_id, 
	me.extraName, 
	m2.name,
	c.KD,
	c.mV,
	c.mDD, 
	c.scR, 
	ul.language, 
	c.defaultLanguage

BTW. als ich diese Abfrage das erste mal sah, war meine Reaktion. Schmeiß weg die Datenbank und mach neu. Das da ist faktisch Kaputt. Also halten wir fest. Wenn ihr sowas zusammenschreibt, Überdenkt euer Datenbank Design nochmal dringendst! Weil dann ist das nämlich Defekt, vollkommen Defekt!