我正在使用Business Objects,它运行在Oracle SQL数据库之上.我没有访问PL或任何类型的SQL命令行,我没有对数据库的写访问权限.我只能将查询作为单个命令运行,需要输出一组已定义的列.
我可以从用户提示中获取数据,这些提示出现在SQL中:
@variable('Prompt1')
Run Code Online (Sandbox Code Playgroud)
例如我可以说:
SELECT
A.SomeDate
FROM
A
WHERE
A.SomeDate BETWEEN @variable('Start') AND @variable('End Date')
Run Code Online (Sandbox Code Playgroud)
这很容易.它运行; 请求用户输入一些日期; 然后返回它们之间的所有匹配(包括).
但问题是,用户将使用Business Objects的"Infoview"系统来运行查询,并且提示系统会显示日期选择器 - 默认情况下包括日期的时间部分("01/01/2016 12 :00:00 AM").
如果用户没有删除时间部分,如果SomeDate值超出所选时间,则可能导致错过记录.例如,如果我想获取今天的所有记录,那么我在技术上想要在00:00:00(午夜)和23:59:59之间的所有内容.
我真正希望能够在查询变量周围使用TRUNC,如下所示:
WHERE
A.SomeDate BETWEEN TRUNC(@variable('Start')) AND TRUNC(@variable('End Date'))
Run Code Online (Sandbox Code Playgroud)
...但是这会导致编译错误:"数据类型不一致:预期DATE得到NUMBER".我不知道为什么Oracle会在编译之前将提示视为数字数据类型.
有谁知道如何获取@variable值并将其转换为我能够截断为日期值的东西?
因此,我正试图找到解决这个问题的方法.我想到的一件事是,如果我可以使用提示变量并使用TO_DATE将其显式转换为日期
编辑:有人向我指出,TRUNC将无效,因为"12:00:00 AM"已经是午夜.所以我觉得我误解了TRUNC.似乎它将它截断到午夜:而我认为它只是完全删除了日期的时间部分,这意味着匹配将在00:00:00和23:59:59之间的任何时间返回.
我真正想要的是:如果SomeDate有一个时间部分,例如,11:03那么当结束日期提示只指定当天时,我如何确保包括它?
快速问题数据库专家.请参阅从Excel调用的以下代码(VBA/ADO):
Dim DBPath As String, ConnStr As String
DBPath = ThisWorkbook.Path & Application.PathSeparator & "Database.mdb"
ConnStr = "Data Source=" & DBPath & ";" & "Jet OLEDB:Database Password=" & DBPass()
Dim cnn as ADODB.Connection
Set cnn = New ADODB.Connection
With cnn
.Provider = CheckProvider(strPath:=DBPath) ' Separate function call. Ignore
.Mode = adModeRead
.Open ConnStr
End With
Stop ' To inspect the directory...
Run Code Online (Sandbox Code Playgroud)
在给定"adModeRead"规范的情况下,它应该以只读方式打开数据库.但是我注意到,当连接处于活动状态时,仍在目录中创建/删除锁定文件(Database.ldb).当然这与只读命令相反,后者应该意味着不能写入任何数据,因此不需要文件锁定.
谁能解释一下这里发生了什么?谢谢.
编辑:和后续 - 如果我想打开连接纯粹只读而不创建任何锁定文件,还有其他方法吗?
我想直接在工作表上创建ActiveX对象.我可以很容易地以编程方式完成此操作.
我还想要将几个控件与特定背景组合在一起.我决定最简单的方法是在Frame对象中创建它们:即控件将是框架的"子对象".
以下示例代码完成了这项工作:
Sub CreateFormOnSheet()
With ActiveSheet
' Add the frame background:
.OLEObjects.Add(ClassType:="Forms.Frame.1", Left:=10, Top:=10, Width:=300, Height:=300).Name = "container_frame"
With .OLEObjects("container_frame")
With .Object
.Caption = "This is the frame caption"
.BackColor = RGB(150, 0, 100)
.BorderColor = RGB(255, 255, 255)
.Controls.Add("Forms.CommandButton.1").Name = "MyButton"
With .Controls("MyButton")
.Left = 10
.Top = 10
.Width = 100
.Height = 50
.BackColor = RGB(0, 0, 100)
.ForeColor = RGB(255, 255, 255)
.Caption = "My Button"
.FontName = "Arial"
.Font.Bold = True
.Font.Size = 10 …Run Code Online (Sandbox Code Playgroud) 我在 Excel 中有一个用户窗体,其中问题在 Listbox 控件中编入索引。单击列表框中的项目会调用 Change 事件,该事件根据已选择的项目填充其他控件的值。
用户可以更改文本框中的值。更改它们后,该问题的“已保存”标志将设置为 False。然后用户可以将问题保存到内存中;或离开问题。
如果用户在没有保存的情况下导航离开(通过单击列表框中的不同项目),我想向他们显示警告 - 提供放弃未保存更改的选项;或保留当前选择,并恢复他们刚刚单击的列表框选择。
如果选择“放弃更改”,则工作正常。但是,当我尝试恢复列表框选择时遇到了麻烦。我使用“EventsOn”布尔值来处理何时应该继续更改过程,以避免它调用自身。这似乎有效,在代码中的正确位置。但是在 EventsOn 恢复之后,并且在Exit Sub 之后,似乎再次调用了 Change 事件。
我不知道为什么该事件再次触发。这会导致用户第二次看到该选项。
下面的很多代码因为涉及到其他表单控件的细节,所以被删掉了;从数据库加载/保存数据;和处理类和字典。但是我保留了表单控件的相关逻辑:
Option Explicit
Dim NumberOfQuestions As Long
Dim EventsOn As Boolean
Dim SelectedListIndex As Long, CurrentQuestion As Long, QuestionSaved As Variant
Private Sub UserForm_Initialize()
' Stripped out lots of code here. Basically opens a recordset and loads values
ReDim QuestionSaved(1 To NumberOfQuestions) As Boolean
'
For X = 1 To NumberOfQuestions
lbox_QuestionList.AddItem "Question " …Run Code Online (Sandbox Code Playgroud) 让我们在 Oracle 中进行一个简单的查询:
SELECT
CASE.ID,
CASE.TYPE,
CASE.DATE_RAISED
FROM
CASE
WHERE
CASE.DATE_RAISED > '2019-01-01'
Run Code Online (Sandbox Code Playgroud)
现在假设另一个表 EVENT 包含多个事件,这些事件可能与每个案例相关联(通过 EVENT.CASE_ID 链接)。或根本不存在。我想报告每个案例中最早日期的未来事件 - 或者如果不存在,则返回 NULL。我可以使用 SELECT 子句中的子查询来做到这一点,如下所示:
SELECT
CASE.ID,
CASE.TYPE,
CASE.DATE_RAISED,
(
SELECT
MIN(EVENT.DATE)
FROM
EVENT
WHERE
EVENT.CASE_ID = CASE.ID
AND EVENT.DATE >= CURRENT_DATE
) AS MIN_EVENT_DATE
FROM
CASE
WHERE
CASE.DATE_RAISED > '2019-01-01'
Run Code Online (Sandbox Code Playgroud)
这将返回一个像这样的表:
Case ID Case Type Date Raised Min Event Date
76 A 03/01/2019 10/05/2019
43 B 02/02/2019 [NULL]
89 A 29/01/2019 08/07/2019
90 A 04/03/2019 [NULL]
102 C 15/04/2019 20/05/2019
Run Code Online (Sandbox Code Playgroud)
请注意,如果不存在任何符合条件的事件,则仍会返回该行但没有值。这是因为子查询在 …