Laden...

Forenbeiträge von IUndisposable Ingesamt 8 Beiträge

01.09.2011 - 09:07 Uhr

Moin dN!3L,

ich habe bei mir das Problem mit einem MessageFilter gelöst. Hier mal ein Klassenrumpf zur Verdeutlichung:



public class MyMessageObserver : IMessageFilter, IDisposable
{
  private Control myControl;

  public MyMessageObserver(Control myControl)
  {
    this.myControl = myControl;
    Application.AddMessageFilter(this);
  }

  public void Dispose()
  {
    Application.RemoveMessageFilter(this);
  }

  public bool PreFilterMessage(ref Message m)
  {
    switch (m.Msg)
    {
      case WM_LBUTTONDOWN:
      case WM_RBUTTONDOWN:
      case WM_MBUTTONDOWN:
        // Hier eigene Aktionen für this.myControl durchführen
    }

    return false; // Hier false zurückgeben, damit die Message vom getroffenen Control bearbeitet wird
  }
}

Über this.myControl und das HWnd im Message-Parameter kann man dann feststellen, wohin geklickt wurde und entsprechend reagieren.

31.08.2011 - 09:03 Uhr

Moin manullino,

mit dem folgenden SQL-Statement kannst du ermitteln, mit welchen anderen Records sich ein bestimmter Record bezüglich des Zeitraums überschneidet:


SELECT a.RecordNr , b.RecordNr AS SchnittRecordNr
FROM 
  dbo.Table1 a 
    JOIN dbo.Table1 b ON a.RecordNr <> b.RecordNr AND b.StartTime < a.EndTime AND a.StartTime < b.EndTime
ORDER BY 
 a.RecordNr, b.RecordNr

Aus dem Ergebnis kannst du dann ablesen, welche Records sich überschneiden. Für den Beispiel ergibt sich:


RecordNr  SchnittRecordNr
1	   2
1	   4
2          1
2	   4
4	   1
4	   2

12.08.2011 - 10:11 Uhr

Sorry (ich hatte noch keinen Kaffee 😭), so bekommst du natürlich immer einen Datensatz für Rohstoff und einen für Gewicht.

Versuch mal diese Variante:


SELECT
  Tabelle1.Objektname, 
  Tabelle1.Standort,
  (SELECT TOP 1 Tabelle2.Value FROM Tabelle2 WHERE Tabelle1.Objektname = Tabelle2.Objektname AND Tabelle2.Description2 = 'Rohstoff') AS 'Rohstoff',
  (SELECT TOP 1 Tabelle2.Value FROM Tabelle2 WHERE Tabelle1.Objektname = Tabelle2.Objektname AND Tabelle2.Description2 = 'Gewicht') AS 'Gewicht'
FROM 
  Tabelle1
WHERE 
  Tabelle1.Standort LIKE 'Maschine%'

Sollte besser sein, könnte aber aus Performancesicht kritisch sein, musst du mal testen.

12.08.2011 - 10:02 Uhr

Moin Neidhard,

ich habe dein SQL-Statement aus dem Eingangspost einmal umformuliert (ungetestet), so dass es das liefert, was ich aus deiner Beschreibung interpretiere:


SELECT
  Tabelle1.Objektname, 
  Tabelle1.Standort,
  CASE WHEN Tabelle2.Description2 = 'Rohstoff' THEN Tabelle2.Value ELSE NULL END AS Rohstoff,
  CASE WHEN Tabelle2.Description2 = 'Gewicht' THEN Tabelle2.Value ELSE NULL END AS Gewicht
FROM 
  Tabelle1 LEFT OUTER JOIN Tabelle2 ON Tabelle1.Objektname = Tabelle2.Objektname
WHERE 
  Tabelle1.Standort LIKE 'Maschine%'

Falls in Tabelle2 für einen Objektnamen die gleiche Description2 mehrfach vorkommt, bekommst du dann aber auch zwei Ergebnisse. Hier musst du ggf. noch mit sinnvollen Gruppierungen arbeiten, ein Distinct sehe ich nicht als hilfreich.

04.08.2011 - 09:35 Uhr

Natürlich habe ich es ausprobiert, sonst würde ich es nicht posten. Getestet habe ich es mit SQL Anywhere 11, dort läuft es.

Ich habe es jetzt auch noch mal auf dem SQLServer getestet, da geht es dann tatsächlich nicht in dieser Form.

04.08.2011 - 09:05 Uhr

Hallo Lion1984,

deine Variante gefällt mir, auf ein bedingtes GroupBy bin ich gar nicht gekommen. Noch etwas kompakter ist folgende Umformulierung deiner Variante:



SELECT 
  CASE 
    WHEN KeyWordId IN(1,2,3) THEN 'A'
    WHEN KeyWordId IN(4,5,6) THEN 'B'
    END as Cluster,
  SUM(Zugriffe) AS Zugriffe 
FROM 
  <Tablename>
GROUP BY
  Cluster

Edit: Scheint so nicht in jedem Datenbanksystem zu laufen, getestet auf SQL Anywhere 11, dort geht es. Auf dem MS SQLServer allerdings nicht.

03.08.2011 - 12:05 Uhr

Per SQL kannst du die Cluster folgendermaßen ermitteln:


SELECT
  SUM(CASE WHEN KeyWordId IN (1,2,3) THEN Zugriffe ELSE 0 END) AS Cluster123,
  SUM(CASE WHEN KeyWordId IN (4,5,6) THEN Zugriffe ELSE 0 END) AS Cluster456
FROM
  <Tablename>

Falls du die Ergebnisse wie in deinem Beispiel in einzelnen Zeilen benötigst, kannst du auch folgendes schreiben:


SELECT
  'Cluster123' AS KeyWordIdCluster, SUM(Zugriffe) AS Zugriffe
FROM
  <Tablename>
WHERE 
  KeyWordId IN (1,2,3)
UNION ALL
SELECT
  'Cluster456' AS KeyWordIdCluster, SUM(Zugriffe) AS Zugriffe
FROM
  <Tablename>
WHERE 
  KeyWordId IN (4,5,6)

Mit SQLLite habe ich keine Erfahrungen, wie die konkrete Syntax dort aussieht kann ich dir leider nicht sagen.

22.07.2011 - 12:30 Uhr

Mit CASE-WHEN funktioniert die Einschränkung folgendermaßen:

SELECT Feld1, Feld2, Feld3, Feld4
FROM Tabelle1
WHERE CASE @Ebene
  WHEN 0 THEN Feld1
  WHEN 1 THEN Feld2 END = @Parameter2