小编Chr*_*lle的帖子

在Oracle SQL中将用户提示作为日期(甚至是字符串)传递

我正在使用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那么当结束日期提示只指定当天时,我如何确保包括它?

sql oracle truncate business-objects infoview

6
推荐指数
1
解决办法
2051
查看次数

为什么即使在只读时,ADO连接仍会创建"ldb"锁定文件?

快速问题数据库专家.请参阅从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).当然这与只读命令相反,后者应该意味着不能写入任何数据,因此不需要文件锁定.

谁能解释一下这里发生了什么?谢谢.

编辑:和后续 - 如果我想打开连接纯粹只读而不创建任何锁定文件,还有其他方法吗?

excel ms-access vba locking ado

5
推荐指数
1
解决办法
672
查看次数

工作表上的容器框架中的表单对象处于非活动状态,除非手动切换设计模式.为什么?

我想直接在工作表上创建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 excel-vba

5
推荐指数
1
解决办法
70
查看次数

VBA:ListBox Change 事件触发两次

我在 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)

excel vba listbox userform

5
推荐指数
1
解决办法
868
查看次数

Oracle SQL - 从子查询返回多列

让我们在 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)

请注意,如果不存在任何符合条件的事件,则仍会返回该行但没有值。这是因为子查询在 …

sql oracle join subquery

1
推荐指数
1
解决办法
6358
查看次数