2017-11-23 3 views
0

Gibt es einen Fehler in Crystal Report das Problem ist, dass er die Daten seit Orakel nicht wiederherstellen kann, habe ich eine Abfrage, die auf Orakel funktioniert, aber wenn ich es auf Befehl posten, zunächst es funktioniert gut, aber nach einem Moment zeigt er mir diesen Fehler, mir bitte jemand helfen kann, und dies ist die AbfrageCrystal Report konnte Daten aus der Datenbank nicht abrufen

select to_char(to_date('1970-01-01 00','yyyy-mm-dd hh24') + (time)/60/60/24 
, 'YYYY-MM-DD') datestr, 
L.LOGINID, 
L.STATUS, 
L.TIME, 
O.PRESENTATION_NAME, 

N_CALLSANSWERED_ 
from "REP_STAT_DB"."LOGIN" L 
      join "GCTI_DMART"."O_AGENT_DAY" O on 
    L.AGENTDBID=O.CONFSERVER_OBJ_ID 
      join "GCTI_DMART"."R_AGENT_DAY" R on O.OBJECT_ID=R.OBJECT_ID 
     join "GCTI_DMART"."T_AGENT_DAY" T on T.TIME_KEY=R.TIME_KEY AND 
    T.BEGIN_TIME=to_char(to_date('1970-01-01 00','yyyy-mm-dd hh24') + 
    (time)/60/60/24 , 'DD/MM/YY') 
    where O.DELETE_TIME IS NULL 

gab keine Daten abzurufen:

enter image description here

+0

Bitte zeigen Sie die Tabelle Schema Definition und Beispieldaten. – OldProgrammer

+0

die Abfrage funktioniert auf Orakel, gibt es 4 Tabellen, das Problem ist, dass, warum es auf Oracle und nicht auf SAP funktioniert –

+0

So 'time' ist eine ganze Zahl Spalte in einer der Tabellen und enthält Sekunden seit '1970-01-01 00 : 00: 00 '? Und welcher Datentyp ist 'T.BEGIN_TIME'? Was enthält es? –

Antwort

0

der Fehler ist erhalten ora-1843: not a valid month. Dies ist ein Datenkonvertierungsfehler, den Oracle wirft, wenn wir versuchen, eine Zeichenfolge an ein Datum zu übergeben, und die Zeichenfolge enthält einen Wert, der kein gültiges Datum ist.

Warum Sie dies nicht erhalten, wenn Sie die Abfrage in Oracle ausführen, hängt davon ab, ob Sie dieselbe Datenbank für beide Clients verwenden.

Wenn Sie SAP gegen eine andere Datenbank betreiben, die einfach ist: verschiedene Datenbanken, verschiedene Datensätze. Sie müssen nur die Rogue-Aufnahmen aufspüren.

Wenn es in beiden Fällen die gleiche Datenbank ist, ist das schwieriger. Vielleicht legt Crystal Reports im Vergleich zu Ihrem Oracle-Client ein anderes Format für das Format des Sitzungsdatums fest? Dies würde beißen, wenn Ihre Abfrage implizite Datumskonvertierungen aufweist. Es gibt keine offensichtlichen Kandidaten für implizite Datumskonvertierungen, aber Sie kennen Ihr Datenmodell besser als wir.

+0

Ich danke dir definitiv für deine Antwort, für die Daten verwende ich die gleiche Datenbank für beide Clients, der eintreffende sap hat die Daten wiederhergestellt, aber lokal funktioniert es gut, aber wenn ich eine Verbindung mit einem anderen Rechner mit sap derselben Version (sap) herstelle um auf den Server zuzugreifen bekomme ich den Fehler erneut, ich verstehe nicht, warum der SAP Daten lokal wiederhergestellt wird, aber in der Client-Maschine zeigt diesen Fehler –

0

Es ist eine schlechte Idee, Daten und Zeitstempel nicht in geeigneten Datentypen, sondern in Zahlen zu speichern. Dies führt genau zu den Problemen, denen Sie gegenüberstehen. hier

ist Ihr Fehler:

T.BEGIN_TIME = to_char(to_date('1970-01-01 00','yyyy-mm-dd hh24') + 
       (time)/60/60/24 , 'DD/MM/YY') 

T.BEGIN_TIME ist vom Typ DATE. TO_CHAR(...), ist jedoch eine Zeichenfolge. Daher konvertiert Oracle Ihre Daten, um die beiden zu vergleichen. Es konvertiert Ihre Zeichenfolge in DATE, um zwei Daten zu vergleichen. Ihre Zeichenfolge enthält ein Datum im Format "TT/MM/JJ". Abhängig von den Sitzungseinstellungen versucht Oracle, es irgendwie zu interpretieren. Sie erhalten den Fehler, weil dies fehlschlägt. Ich nehme an, dass Ihre Sitzungseinstellung darauf hindeutet, dass ein Datum mit dem Monat beginnt, daher wird '13/02/17 'als' 2017-13-02 'interpretiert, der einen ungültigen Monat enthält.

Verwenden Sie keine Zeichenfolgen, wenn Sie mit Datumsangaben arbeiten möchten. Um den Datumsteil eines Zeitstempels zu erhalten, verwenden Sie stattdessen TRUNC.

Die Abfrage korrigiert:

select 
    to_char(date '1970-01-01' + interval '1' second * time, 'yyyy-mm-dd') datestr, 
    l.loginid, 
    l.status, 
    l.time, 
    o.presentation_name, 
    n_callsanswered_ 
from rep_stat_db.login l 
join gcti_dmart.o_agent_day o on l.agentdbid = o.confserver_obj_id 
join gcti_dmart.r_agent_day r on o.object_id = r.object_id 
join gcti_dmart.t_agent_day t 
     on t.time_key = r.time_key 
     and t.begin_time = trunc(date '1970-01-01' + interval '1' second * time) 
where o.delete_time is null; 

Wenn Sie den Zeitstempel in einem DATE statt Sekunden seit ‚1970-01-01 00.00.00‘ gespeichert sind, würde die Abfrage noch einfacher sein. Wie bereits erwähnt, ist es eine schlechte Idee, nicht den entsprechenden Datentyp zu verwenden (DATE in diesem Fall, der Oracle Datetime-Datentyp ist, oder TIMESTAMP).

+0

Vielen Dank für Ihre Mühe scheint es logisch, es ist funktional auf Oracle, aber auf SAP-Crystal-Bericht hier ist der neue Fehler ORA-00911 ungültiges Zeichen @Thorsten –

+0

Tut mir leid, das zu hören. Leider habe ich selbst nie mit Kristallberichten gearbeitet, ich habe keine Ahnung, was falsch ist. –

Verwandte Themen