Как обновить несколько строк одного столбца в одном запросе с использованием базы данных FoxPro?

#database #foxpro

#База данных #foxpro

Вопрос:

Я хочу обновить множественный баланс в соответствии с их номером счета-фактуры всего за один запрос. Но приведенный ниже код выглядит так, как будто FoxPro не принимает его.

PS: я использую Visual FoxPro 6 только в качестве базы данных на моем классическом веб-сайте ASP.

  UPDATE accounts_receivables SET balance = 
      CASE invoice_no 
       WHEN 3 THEN 6
       WHEN 4 THEN 8
       ELSE balance
      END
      WHERE invoice_no IN (3,4)
 

Ответ №1:

Вместо этого вы должны использовать функцию ICASE(). Вот так:

  UPDATE accounts_receivables SET balance = 
      ICASE (
       invoice_no = 3, 6,
       invoice_no = 4, 8,
       "balance" 
            )
      WHERE invoice_no IN (3,4)
 

Комментарии:

1. FoxPro сообщает, что «Команда содержит нераспознанную фразу / ключевое слово»

2. Ошибка поставщика Microsoft OLE DB для драйверов ODBC ‘80040e37’ [Microsoft] [ODBC Visual FoxPro Driver] Файл ‘icase.prg’ не существует.

3. Какую версию Visual FoxPro вы используете? Работает в VFP 9.0 SP2

4. Протестируйте только эту строку: ? ICASE(1 1 = 2, «Первое значение true», 1 1 = 3, «Второе значение false», «Ни одно значение true»)

5. Я использую Visual FoxPro 6

Ответ №2:

Это будет работать с VFP6:

 UPDATE accounts_receivables SET balance = iif(invoice_no=3, 6, iif(invoice_no=4, 8, balance)) WHERE invoice_no IN (3,4)
 

Это также логически совпадает с записью как:

 UPDATE accounts_receivables SET balance = iif(invoice_no=3, 6, 8)) WHERE invoice_no IN (3,4)
 

пока вы фильтруете только по 3, 4.

Однако вы также можете использовать сделать это через VFPOLEDB (даже из VFP6), а затем вы также можете написать запрос, поддерживаемый VFP9 (поскольку вы говорите «ASP», вероятно, вы уже обращаетесь к данным через драйвер VFP вместо прямого доступа, вы можете просто использовать VFPOLEDB и использовать VFP9поддерживается SQL).

Пример в VFP (почти тот же код из ASP или VBA):

 Local oCon, oCmd
oCon = Createobject("ADODB.Connection")
oCmd = Createobject("ADODB.Command")

oCmd.CommandType = 1
oCmd.CommandText = "UPDATE accounts_receivables" ;
    " SET balance = icase(invoice_no=3, 6, invoice_no=4, 8, balance)" ;
    " WHERE invoice_no IN (3,4)"

oCon.ConnectionString = "Provider=VFPOLEDB;Data Source=c:MyDataFolder"
oCon.Open()

oCmd.ActiveConnection = oCon
oCmd.Execute
 

И говоря ASP, если вы действительно имели в виду ASP.Net в этом случае, а не в старом классическом ASP, тогда вы могли бы даже сделать это проще, например:

 string sql = @"UPDATE accounts_receivables
    SET balance = icase(invoice_no=3, 6, invoice_no=4, 8, balance)
    WHERE invoice_no IN (3,4)"; 
using(OleDbConnection con = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:MyDataFolder"))
using(OleDbCommand cmd = new OleDbCommand(sql,con))
{
   con.Open();
   cmd.ExecuteNonQuery();
   con.Close();
}
 

Комментарии:

1. Спасибо, чувак! Но как я могу обновить, если записей больше двух? Также я использую классический ASP

2. Возможно, icase не поддерживается VFP6, ошибка гласит: «Файл «icase.prg «не существует»

3. @iJ4419, вы можете обновить несколько, как я показал в приведенном выше коде. icase() НЕ поддерживается VFP6, однако, поскольку вы используете классический ASP, вы можете просто использовать OLEDB (VFPOLEDB) с ADODB, как я показал в приведенном выше коде. VFPOLEDB. поддерживает VFP9 и, следовательно, поддерживает SQL, совместимый с VFP9, а также iCase().

4. И, говоря несколько, если у вас много совпадений (т. Е.: 2-4, 3-6, 4-X, 5-Y …), То использование iif () или iCase () — это не правильный путь (поскольку это не путь в SQL server с использованием «case when … end»). В этом случае у вас должен быть дополнительный курсор (вероятно, созданный во время выполнения), который содержит пары значений для совпадений. Затем вы можете выполнить обновление с помощью этого курсора, используя VFPOLEDB (и, следовательно, расширенную поддержку SQL, недоступную в VFP6).

5. Я что-то сделал, и это работает только для 10 записей. Я полагаюсь на ваш код и вложенные 9 iif. Поэтому я обновляю его всякий раз, когда уже есть 10 записей, и просто сбрасываю строку. Спасибо за ваш ответ, человек! Действительно ценю это :))