Dataset open ошибка

elam

0 / 0 / 0

Регистрация: 01.02.2016

Сообщений: 10

1

27.01.2017, 20:50. Показов 5665. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Пытаюсь выбрать таблицу с помощью combobox но выходит такая ошибка Cannot perform this operation on an open dataset что делат ?

Delphi
1
2
3
case ComboBox1.ItemIndex of
0:ADOTable1.TableName:='table1';
1:ADOTable1.TableName:='table2';



0



5089 / 4103 / 1026

Регистрация: 29.08.2013

Сообщений: 26,008

Записей в блоге: 3

27.01.2017, 22:19

2

закрыть датасет
и только потом менять таблицу



0



D1973

Модератор

8487 / 5647 / 2290

Регистрация: 21.01.2014

Сообщений: 24,228

Записей в блоге: 3

28.01.2017, 08:03

3

Delphi
1
2
3
ADOTable1.Active := false;
//Что-то делаешь
ADOTable1.Active := true;



0



elam

0 / 0 / 0

Регистрация: 01.02.2016

Сообщений: 10

29.01.2017, 12:16

 [ТС]

4

эта я итак знаю вы меня не поняли

Добавлено через 6 минут

Delphi
1
2
3
4
5
if ComboBox1.ItemIndex=0 then
ADOTable1.Active:=true;
ADOTable1.TableName:='table1'
and
ADOTable1.Active:=false;

это не правильно



0



D1973

Модератор

8487 / 5647 / 2290

Регистрация: 21.01.2014

Сообщений: 24,228

Записей в блоге: 3

29.01.2017, 19:39

5

Цитата
Сообщение от elam
Посмотреть сообщение

это не правильно

конечно неправильно. Тебе что писали? Сперва закрыть, потом сменить, потом открыть… А ты что делаешь? Сразу открываешь, потом пытаешься менять…

Delphi
1
2
3
4
5
6
ADOTable1.Active := false; 
case ComboBox1.ItemIndex of
  0 : ADOTable1.TableName := 'table1';
  1 : ADOTable1.TableName := 'table2'; 
end;
ADOTable1.Active := true;



0



0 / 0 / 0

Регистрация: 01.02.2016

Сообщений: 10

29.01.2017, 21:14

 [ТС]

6

спасибо



0



Написал приложение, которое подключается к базе данных и должно отображать данные таблиц (пока что одной). На DataModule накидал IBQuery (select * from clients), IBDataSource, IBDataSet, IBDataSetProvider связал их с IBDatabase, находящееся на другой форме. При открытии окна с DBGrid (связанным по DataSource c IBDataSource) возникает ошибка

IBQuery1: Cannot perform this operation on an open dataset.

Отладка показала, что эта ошибка возникает на строке

mydm.IBQuery1.ExecSQL;

в следующем блоке кода

procedure TfmTableData.FormActivate(Sender: TObject);
var openTable : TTableSpec;
    CountColumns : integer;
  I: Integer;
begin
  openTable:=TTableSpec(DBSchema.Tables.FindComponent(fmListOfTables.Listbox1.Items.Strings[fmListOfTables.Listbox1.ItemIndex]));
  CountColumns:=openTable.Fields.ComponentCount;
  //DBGrid1.Columns.:=CountColumns;
  {for I := 0 to CountColumns-1 do
      begin
        DBGrid1.Columns.Add;
        DBGrid1.Columns[i].Title.Caption:=openTable.Fields.Components[i].Name;
      end; }
  MainWindow.IBDatabase1.Connected:=true;
  //IBTable1.TableName:='CLIENTS';
  mydm.IBDataSet1.Close;
  mydm.IBQuery1.Open;
  mydm.IBQuery1.ExecSQL;
  //IBDataSet1.Open;
  //IBTable1.
  //fmTableData.DataSource1.DataSet:=IBDataset1;
  //fmTableData.DBGrid1.DataSource:=fmTableData.IBDataset1;
end;

задан 23 ноя 2012 в 16:33

ivan89's user avatar

ivan89ivan89

1,56411 золотых знаков56 серебряных знаков105 бронзовых знаков

У вас проблема в том, что вы вызываете метод Open, а потом сразу заним еще и ExecSQL.

mydm.IBQuery1.Open;
mydm.IBQuery1.ExecSQL;

Надо выбрать что-то одно. Для SELECT запросов используйте метод Open. Для всех остальных, которые не возвращают набор данных, используйте ExecSQL.
У вас в данном примере, лишний метод ExecSQL, т.к. запрос у вас типа SELECT в Query.

ответ дан 28 ноя 2012 в 2:46

Timenzzo's user avatar

TimenzzoTimenzzo

4655 серебряных знаков16 бронзовых знаков

Open лишний, достаточно только ExecSQL

Kromster's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

ответ дан 23 ноя 2012 в 16:36

Rsecomua's user avatar

RsecomuaRsecomua

4,24312 серебряных знаков17 бронзовых знаков

2

file-transfers-_114260033.s300x300Файловый интерфейс и юникод

Поскольку содержимое файлов отражает структуру данных, обрабатываемую в памяти, файловый интерфейс в юникодных системах должен позволять следующее:

  1. Должна быть возможность обмена данными между юникодными и не юникодными системами (т.к. отображение данных в памяти отличается);
  2. Должна быть возможность обмена данными между различными юникодными системами;
  3. Должна быть возможность обмена данными между разными не юникодными системами, в которых используются различные кодировки.

Данные требования накладывают определенные ограничения, так в юникодных системах требуется обязательное указание кодовой страницы, перед работой через интерфейс, кроме того:

  • Файл должен быть явным образом открыт (OPEN DATASET), перед операцией чтения или записи. Кроме того файл, который был уже открыт ранее, не может быть открыт снова (до тех пор, пока не будет закрыт). В не юникодных системах открытие файла происходит неявным образом при обращении к нему (например, при чтении), соответственно не требуется явного открытия перед началом работы. Кроме того, выражение для открытия файла может быть запущено неоднократно, несмотря на то, что открыть файл в программе можно только после его закрытия, либо в первый раз. Повторное открытие в не юникодных системах просто пропускается.
  • Тип доступа (INPUT,OUTPUT..) и режим обработки файла (TEXT, BINARY) должны быть явно определены, когда файл открывается. В не юникодных системах, если ничего не будет задано, файл откроется с неявно заданными параметрами по умолчанию.
  • Если файл открыт для чтения, возможно только чтение. В не юникодных системах кроме чтения, возможна так же и запись.
  • Если файл открыт как текстовый (дополнение TEXT), только символьные переменные могут быть считаны или записаны в него. В не юникодных системах допускается считывание и запись из байтовых или числовых переменных.

Рекомендуется придерживаться правил определенных в юникодных системах, даже если вы работаете в не юникодной системе.

Для поддержки работы с юникодом, был создан специальный системный класс CL_ABAP_FILE_UTILITIES. Некоторые его методы:

  • CHECK_FOR_BOM – проверить наличие в файле метки BOM.
  • CHECK_UTF8 – хранится ли файл в UTF-8. MAX_KB – определяет размер KB при сканировании.
  • CREATE_UTF8_FILE_WITH_BOM – создание файла в UTF-8 с меткой.
  • CHECK_XSTRING_UTF8 – проверить последовательность на наличие UTF-8 кодировки.
  • CHECK_STRING_7BIT_ASCII – проверяет, содержит ли строка только ASCII символы.

Операторы файлового интерфейса

Как было уже упомянуто ранее, файловый интерфейс в ABAP реализован с помощью набора операторов и их параметров:

  • OPEN DATASET
  • TRANSFER
  • READ DATASET
  • GET DATASET
  • SET DATASET
  • TRUNCATE DATASET
  • CLOSE DATASET
  • DELETE DATASET

OPEN DATASET

Синтаксис:

OPEN DATASET dset FOR access IN mode [position] [os_additions] [error_handling].

Данный оператор открывает файл, указанный в dset, для доступа указанного в access и режиме хранения mode. Dset – символьная переменная, в которой будет правильное, с точки зрения ОС, физическое имя файла. Файл нельзя открывать более одного раза, без закрытия, иначе система вызовет исключение (для юникодных систем).

Дополнения position, os_additions, error_handling  указывают, с какой позиции начинать обработку файла, дополнения зависимые от ОС сервера приложений и поведение, связанное с обработкой ошибочных ситуаций.

Особенности:

  • Количество файлов одновременно обрабатываемых не может превышать 100, для одной сессии.
  • При открытии набора срабатывают автоматические проверки полномочий (рассмотрены выше).
  • Если имя файла приходит откуда-то извне, необходимо его проверить, чтобы не подвергать систему риску, связанному с обходом доступа к директориям:

CALL FUNCTION ‘FILE_VALIDATE_NAME’

  EXPORTING

    logical_filename           = ‘EXAMPLE_FILE’

  CHANGING

    physical_filename          = file

  EXCEPTIONS

    logical_filename_not_found = 1

    validation_failed          = 2

    OTHERS                     = 3.

IF sysubrc = 0.

  OPEN DATASET file FOR OUTPUT IN BINARY MODE.

ELSE.

  cl_demo_output=>display( |Error return code { sysubrc }| ).

ENDIF.

В приведенном ниже примере демонстрируется программа, в которой существует возможность обхода полномочий, так как нет проверки (уязвимость проявляет себя, когда в качестве части пути указываются «../» или «..»):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

PARAMETERS: pv_fname TYPE c LENGTH 64 LOWER CASE DEFAULT ‘test.txt’,

            pv_text  TYPE string LOWER CASE DEFAULT ‘Содержимое файла’.

DATA        lv_full_name TYPE string.

AT SELECTION-SCREEN.

  IF pv_fname = ».

    MESSAGE ‘Необходимо указать имя файла’ TYPE ‘E’.

  ENDIF.

  lv_full_name = ‘/tmp/’ && pv_fname. «Assume enduser inputs only a relative file name.

START-OF-SELECTION.

  OPEN DATASET lv_full_name FOR OUTPUT IN TEXT MODE ENCODING UTF8 .

  IF sysubrc <> 0.

    MESSAGE ‘Не могу открыть файл’ && lv_full_name TYPE ‘E’.

  ELSE.

    TRANSFER pv_text TO lv_full_name.

    CLOSE DATASET lv_full_name.

    WRITE :/ ‘Содержимое сохранено в:’, lv_full_name.

  ENDIF.

Возвращаемые значения поля ошибки, после вызова оператора:

sy-subrc Значение
0 Файл был открыт.
8 ОС не смогла открыть файл.

Обрабатываемые исключения

CX_SY_FILE_OPEN

Причины: Файл уже открыт.

Ошибка времени выполнения: DATASET_REOPEN

CX_SY_CODEPAGE_CONVERTER_INIT

Причина: Желаемое преобразование невозможно. (Либо неверно указана желаемая кодировка, либо указанная кодировка не поддерживается на уровне системы)

Ошибка времени выполнения: CONVT_CODEPAGE_INIT

CX_SY_CONVERSION_CODEPAGE

Причина: Преобразование невозможно.

Ошибка времени выполнения: CONVT_CODEPAGE

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу

Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

Причина: Нет доступа к открытию канала,  OPEN DATASET с дополнением FILTER.

Ошибка времени выполнения: OPEN_PIPE_NO_AUTHORITY

CX_SY_PIPES_NOT_SUPPORTED

Причина: ОС не поддерживает именованные каналы.

Ошибка времени выполнения: DATASET_NO_PIPE

CX_SY_TOO_MANY_FILES

Причина: Достигнуто максимальное число открытых файлов.

Ошибка времени выполнения: DATASET_TOO_MANY_FILES

Не обрабатываемые исключения

Причина: Именованный канал уже открыт.

Ошибка времени выполнения: DATASET_PIPE_POSITION

Дополнение access

  … INPUT

| OUTPUT
| APPENDING
| UPDATE … .

Дополнение указывает тип доступа, т.е. каким образом открывается файл: на чтение, запись, добавление или изменение. В юникодных системах указание данного дополнения является обязательным.

  •  INPUT – открывает файл для чтения. По умолчанию указатель внутри файла выставляется на начало файла (при работе с файлами важно понимать, что обычно они обрабатываются не целиком, а частями. Для того чтобы определить необходимое начало и конец, обрабатываемой части файла служит файловый указатель.). Если указанный файл не существует, поле sy-subrc будет равно 8. В юникодных программах запрещено вести запись в открытый для чтения файл, для не юникодных программ это ограничение не действует, однако для совместимости необходимо его соблюдать.
  • OUTPUT – открытие файла для записи. Если файл существовал ранее, его содержимое удаляется. Если файл не существует, он создается. Чтение так же разрешено.
  • APPENDING – открытие файла для добавления. Если файл уже существовал, он откроется,  указатель будет перемещен в конец файла. Если файл не существовал, он создается. Попытка чтения файла оператором READ DATASET будет прервана, sy-subrc возвратит 4.
  • UPDATE – открытие файла для обновления существующего содержимого. По умолчанию указатель будет выставлен в начало файла. Если указанный файл не существует, sy-subrc возвратит значение равное 8.

Дополнение mode

Данное дополнение указывает на то, работаем ли мы с текстовым файлом или с бинарным. Атрибут LEGACY используется в том случае, когда мы хотим обеспечить совместимость с не юникодными системами.

Синтаксис:

… {BINARY MODE}

| {TEXT MODE encoding [linefeed] }
| {LEGACY BINARY MODE [endian] [CODE PAGE cp]}
| {LEGACY TEXT MODE [endian] [CODE PAGE cp] [linefeed]} … .

  •  BINARY MODE  — открывает файл как бинарный файл. При записи или чтении, бинарное представление переменных переносится в файл (из файла) в неизменном состоянии.
  • TEXT MODE – открывает файл как текстовый. Дополнение Encoding указывает на формат символьного представления (см. ниже). Когда происходит запись в файл, содержимое переменных преобразовывается в соответствии с форматом определенным в Encoding, после чего переносится в файл. Если переменная является символьной (clike) или плоской структурой, пробелы на концах обрезаются. Если используется строковый тип, пробелы не обрезаются. При записи данных, по умолчанию вставляется зависимый от платформы символ конца строки.

Считывание происходит до символа конца строки, затем указанные символы преобразуются в соответствии с форматом определенным в Encoding, в текущий формат для сервера и записываются в переменную. Обработка символов конца строки зависит от дополнения linefeed.  Для юникодных программ, в данном режиме, при передаче или считывании из файла, могут быть использованы только символьные типы, кроме того необходимо обязательное указание дополнения encoding. В не юникодных программах дополнение encoding не обязательно. При перемещении указателя, при работе с текстовым файлом происходит перемещение на указанное количество символов, а не байт.

  • LEGACY – разница с простым открытием в том, что в данном случае можно задать кодовую страницу, через атрибут CODE PAGE и порядок байт, в атрибуте endian.  В режиме LEGACY TEXT MODE пробелы в символьных (clike) переменных или плоских структурах обрезаются.

Дополнение linefeed

Дополнение linefeed имеет следующий синтаксис:

… WITH { NATIVE 

| SMART
| UNIX
| WINDOWS } LINEFEED … .

При использовании данного дополнения, профильный параметр abap/NTfmode (тр. RZ11) игнорируется. Нельзя использовать данное дополнение с дополнением TYPE, если его значение «NT» или «UNIX».

Если данное дополнение не используется, правила определения символа конца строки зависят от текущего сервера приложений и платформы, на которой он запущен:

  • Для UNIX систем (Unix, OS/390, и IBM i5/OS) это «LF».
  • Для Windows – «CRLF». Кроме того для Windows систем может быть использован параметр abap/NTfmode, который определяет какой символ конца строки использовать для новых файлов. Если его значение «b» — используется маркер «LF». Если его значение «t» или пустое – используется маркер «CRLF». Данный параметр может быть переопределен в дополнении TYPE и значением для его «NT» или «UNIX». Если существующий файл был открыт без дополнения TYPE, происходит поиск маркера, если маркер был найден, он и будет использоваться для всего файла. Если маркер не был найден, будет использоваться профильный параметр  abap/NTfmode.

Если дополнение было указано при открытии файла, оно может быть перезаписано, через оператор SET DATASET.

SAP рекомендует указывать дополнение linefeed, т.к. если его не указать логика определения указателя конца строки будет зависеть от множества факторов: ОС сервера приложений, профильный параметр, существующий символ в имеющемся файле.

Значения, указываемые в дополнении:

  • NATIVE – в зависимости от ОС на сервере приложений (см. выше)
  • SMART – данное дополнение зависит от типа доступа к файлу:
    • Если файл открыт на чтение (FOR INPUT), оба маркера будут обрабатываться. При открытии EBCDIC файла так же обрабатывается маркер «NL» (new line).
    • Если файл открыт для дополнения или для обновления (APPENDING, UPDATE) происходит поиск маркера, который уже был использован в файле. Найденный маркер далее используется для записи. Если маркер не будет найден, будет использован маркер для ОС сервера приложений (как с дополнением NATIVE).
    • Если файл открывается для записи (OUTPUT), маркер определяется в зависимости от ОС сервера приложений (как с дополнением NATIVE).
    • UNIX – используется «LF» маркер
    • WINDOWS – используется «CRLF» маркер

Дополнение CODEPAGE

Синтаксис:

…  CODE PAGE cp …

Указывает кодовую страницу, в которой представлены данные файла. Когда данные переносятся из файла в ABAP, происходит автоматическая конвертация в кодовую страницу, использующуюся на сервере приложений (если они не идентичны). При записи происходит аналогичная конвертация в указанную в дополнении кодировку.

В юникодных системах происходит преобразование символов из указанной кодовой страницы в юникодные символы, в соответствии с текущим форматом на сервере приложений.

В качестве параметра cp необходимо использовать переменную со значением из столбца CPCODEPAGE в таблице TCP00.

codepages

Дополнение ENCODING

Синтаксис:

ENCODING { DEFAULT 
             | {UTF-8 [SKIPPING|WITH BYTEORDER MARK]} 
             | NONUNICODE } … .

Определяет формат, используемый для текстовых файлов.  Данное дополнение обязательно для юникодных систем, в не юникодных может быть опущено (по умолчанию примет значение NON-UNICODE).

SAP рекомендует всегда использовать UTF-8 при работе с текстовыми файлами. Так как кодовые страницы не всегда можно идентифицировать относительно содержимого файла.

Может принимать следующие значения:

  • DEFAULT – в юникодных системах тоже самое что и UTF-8, для не юникодных систем NON-UNICODE.
  • UTF-8 [SKIPPING|WITH BYTE-ORDER MARK] – файл обрабатывается в соответствии с кодировкой UTF-8. С помощью дополнения указывается, необходимо ли обрабатывать символ порядка байт (BOM):
    • SKIPING BYTE-ORDER MARK – используется только если файл открывается для чтения или изменения, если в файле присутствует данный символ указатель переводится на позицию после него, без дополнения файл обрабатывается как обычно.
    • WITH BYTE-ORDER MARK – используется для файлов открытых на запись (OUTPUT), если дополнение указано символ вставляется автоматически в начало файла, если не указано символ не будет вставлен.
    • NON-UNICODE – для не юникодных систем, данные переносятся в файл (из файла) без дополнительной конвертации. В юникодной системе, происходит преобразование в соответствии с настроенным присвоением, таблица TCP0C.

cpconvert

Дополнение BYTE-ORDER MARK не может использоваться одновременно с дополнением position (см. ниже).

Рекомендации SAP:

  • При открытии UTF-8 файлов на чтение желательно всегда пропускать символ порядка байт, использовать SKIPING дополнение.
  • При записи в UTF-8 файл, желательно всегда записывать метку с дополнением WITH BYTE-ORDER MARK.
  • С помощью класса CL_ABAP_FILE_UTILITIES и его метода  CREATE_UTF8_FILE_WITH_BOM, можно создать UTF-8 файл с меткой BOM. С помощью метода CHECK_UTF8 можно определить есть ли метка в указанном файле.

UTF-16 файлы могут быть открыты только как бинарные файлы.

Дополнение endian

Синтаксис:

… {BIG|LITTLE} ENDIAN …

Дополнение указывает порядок байтов при записи числовых переменных ABAP (i, decfloat16, decfloat34, f, или s).

Дополнение position

Синтаксис:

AT POSITION pos … .

Переводит указатель файла на указанное в переменной POS число байт. Если в качестве позиции передать -1, указатель будет переведен в конец файла.

Следует знать следующие особенности:

  • Если файл открыт на чтение и значение в pos больше размера файла, указатель становится неопределенным и чтение в таком  случае будет невозможно, до тех пор, пока указатель не будет переведен в пределы размера файла. Если файл обрабатывается в не юникодной системе и происходит запись в него, все последующие от конца файла байты до указателя будут заполнены 16-ричным представлением 0, а запись начнется со следующего байта.
  • Если файл открыт для записи, все символы с начала файла, до указанной позиции заполняются 16-ричным представлением 0 и запись происходит со следующего байта.
  • Если файл открывается для добавления (APPENDING), данное дополнение игнорируется, указатель выставляется в конец файла.
  • Если файл открывается для изменения и позиция указана больше размера файла в байтах, все байты с конца файла по указанную позицию заполняются 16-ричным представлением 0 и запись происходит со следующего байта после указанной позиции.

Дополнение не может быть использовано одновременно с дополнениями FILTER и BYTE-ORDER MARK.

Дополнения os_additions

Синтаксис:

… [TYPE attr]
    [FILTER opcom] … .

Данные дополнения указывают на специфические для ОС параметры при обработке файлов.

  • Дополнение TYPE attr – зависит от ОС, используемой на сервере приложений. Если ОС не MS Windows, символьное значение, определенное в attr, содержит зависимые от ОС параметры для файла, который должен обрабатываться. Для MS Windows в этот параметр, при работе с текстовыми файлами или текстовыми файлами в режиме совместимости, может быть передан идентификатор символа конца строки: «NT» для CRLF «UNIX» для LF, но только в том случае, если не указано дополнение linefeed. Все остальные значения в данном параметре будут проигнорированы для MS Windows.

Пример использования дополнения в ОС IBM i5/OS:

OPEN DATASET ‘test.dat’

  TYPE ‘lrecl=80, blksize=8000, recfm=FB’

  FOR OUTPUT IN TEXT MODE

             ENCODING DEFAULT

             WITH SMART LINEFEED.

  • Дополнение FILTER opcom – данное дополнение поддерживается для ОС (Unix, Windows), работающих с так называемыми именованными каналами (pipes). За более подробной информацией можете обратиться к справке по данному дополнению.

Дополнения error_handling

Синтаксис:

… [MESSAGE msg]
    [IGNORING CONVERSION ERRORS]
    [REPLACEMENT CHARACTER rc] … .

В случае возникновения ошибок, данные дополнения позволяют получать эти ошибки, подавлять некоторые ошибки, определять символы замены для неизвестных символов.

  • Дополнение MESSAGE msg. В случае возникновения ошибки на уровне сервера приложения, в символьную переменную msg будет записан код ошибки, пример:

DATA mess TYPE string.

OPEN DATASET « FOR INPUT IN BINARY MODE MESSAGE mess.

IF sysubrc = 8.

  MESSAGE mess TYPE ‘I’.

ENDIF.

  • Дополнение IGNORING CONVERSION ERRORS. Данное дополнение может быть использовано для подавления исключения CX_SY_CONVERSION_CODEPAGE. Данное исключение возникает, если при работе с файлом невозможно сделать преобразование из одной кодовой страницы в другую. Данное дополнение используется только при обработке текстовых файлов, текстовых файлов в режиме совместимости и бинарных файлов в режиме совместимости, но не для бинарных файлов. При этом каждый не конвертируемый символ заменяется по умолчанию символом «#», либо символом, указываемым в следующем дополнении.
  • REPLACEMENT CHARACTER rc. В качестве rc указывается символ, на который будут заменены не распознанные символы.

TRANSFER

Синтаксис:

TRANSFER dobj TO dset [LENGTH len] 
[NO END OF LINE].

Данный оператор переносит содержимое переменной dobj в файл dset. В качестве переменной может быть использована любая символьная переменная или плоская структура. При обработке бинарного файла используются байтовые типы (x, xstring).  В юникодных программах при записи в текстовый файл может использоваться только символьная переменная (не структура), данное ограничение не распространяется на текстовые файлы, открытые в режиме совместимости.

В качестве dset указывается физическое имя файла. Содержимое dobj передается в файл начиная с текущей позиции указателя. После того, как данные будут перенесены в файл, курсор смесится на следующую позицию после перемещенных данных.

Для записи в юникодных программах, необходимо чтобы файл был открыт для записи, добавления или изменения.  Если файл был не открыт заранее, в не юникодных системах он будет открыт неявно.

В зависимости от типа доступа к файлу, есть определенные особенности:

  • Файл открыт для чтения (FOR INPUT). Нельзя производить запись в юникодных программах. В не юникодных программах запись происходи так же, как если бы он был открыт с типом доступа — FOR UPDATE.
  • Файл открыт для записи (FOR OUTPUT). Запись происходит, начиная с текущей позиции указателя, если указатель был перемещен дальше конца файла, байты с позиции конца файла, по текущую позицию будут записаны 16-ричным представлением 0.
  • Если файл был открыт для добавления (APPENDING) , система начинает вести запись с текущего указателя, при первоначальном открытии указатель находится в конце файла.
  • Файл открыт для изменения (CHANGING). Запись происходит с текущей позиции указателя, если указатель был перемещен дальше конца файла, байты с позиции конца файла, по текущую позицию будут записаны 16-ричным представлением 0. Если часть файла должна быть перезаписана, обязательно открывать с типом доступа CHANGING для юникодных программ. В не юникодных программах, файл, открытый для чтения может быть перезаписан, но SAP не рекомендует этого делать.

Кроме того, на работу оператора влияет  тип содержимого файла:

  • Если файл открыт как текстовый или текстовый в режиме совместимости, любые пробелы на концах символьных переменных обрезаются, кроме переменных с типом string. Если необходимо преобразование, в кодовую страницу отличную от системной, происходит преобразование, затем побайтно идет запись в файл.
  • После записи в файл содержимого из dobj автоматически вставляется метка конца строки, определенная при открытии. Чтобы система не добавляла метку, используется дополнение NO END OF LINE.

Следует знать некоторые особенности:

  • Оператор TRANSFER либо возвращает sy-subrc  = 0, либо вызывает исключение.
  • В не юникодных программах вызов OPEN DATASET перед TRANSFER не обязателен, поэтому в не юникодных программах при вызове оператора TRANSFER срабатывают автоматические проверки доступа к файлу, т.к. происходит неявный вызов OPEN DATASET.

Дополнения:

  • LENGTH len – определяет то, как много байтов или символов (в зависимости от типа содержимого) будет записано в файл.  Для бинарных, текстовых в режиме совместимости и бинарных в режиме совместимости файлов, дополнение определяет количество передаваемых байт.

Если длинна 0 и меньше, ничего не будет записано.  Если количество в len больше количества символов или байт в dobj, вместо недостающих символов (байтов) в файл будут записаны пустые символы (пробелы) или 16-ричное представление 0.

Пример использования оператора TRANSFER:

DATA: file TYPE string VALUE `flights.dat`,

      wa   TYPE spfli.

FIELDSYMBOLS <hex_container> TYPE x.

OPEN DATASET file FOR OUTPUT IN BINARY MODE.

SELECT *

       FROM spfli

       INTO wa.

  ASSIGN wa TO <hex_container> CASTING.

  TRANSFER <hex_container> TO file.

ENDSELECT.

CLOSE DATASET file.

Обрабатываемые исключения

CX_SY_CODEPAGE_CONVERTER_INIT

Причина: Желаемое преобразование невозможно. (Либо неверно указана желаемая кодировка, либо указанная кодировка не поддерживается на уровне системы)
Ошибка времени выполнения: CONVT_CODEPAGE_INIT

CX_SY_CONVERSION_CODEPAGE

Причина: Преобразование невозможно.
Ошибка времени выполнения: CONVT_CODEPAGE

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу
Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

CX_SY_FILE_IO

Причина: Ошибка при записи в файл.
Ошибка времени выполнения: DATASET_WRITE_ERROR

CX_SY_FILE_OPEN

Причина: Файл не может быть открыт.
Ошибка времени выполнения: DATASET_CANT_OPEN

CX_SY_FILE_OPEN_MODE

Причина: Файл не был открыт для указанного типа доступа.
Ошибка времени выполнения: DATASET_NOT_OPEN

Причина: Файл открыт в юникодной программе с использованием OPEN DATASET … FOR INPUT и не может использоваться для записи.
Ошибка времени выполнения: DATASET_READ_ONLY

CX_SY_PIPE_REOPEN

Причина: Рабочий процесс, в котором был открыт файл с именованным каналом либо закрыт, либо переключен.
Ошибка времени выполнения: DATASET_PIPE_CLOSED

CX_SY_TOO_MANY_FILES

Причина: Достигнуто максимальное число открытых файлов.
Ошибка времени выполнения: DATASET_TOO_MANY_FILES

READ DATASET

Синтаксис:

READ DATASET dset INTO dobj [MAXIMUM LENGTH mlen]
                           [[ACTUAL] LENGTH alen].

Данный оператор производит чтение из файла dset в переменную dobj. В качестве переменной может выступать либо переменная с элементарным типом, либо переменная с типом плоской структуры. В юникодных программах обязательно чтобы переменная была символьной, если файл открыт как текстовый. Чтение происходит с текущей позиции указателя в файле. После того как чтение осуществлено, указатель перемещается на длину считанных данных.

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

На работу оператора влияет тип содержимого в файле:

  • Если файл открыт как текстовый или как текстовый в режиме совместимости, данные считываются с текущей позиции до метки конца строки, указатель перемещается на позицию после метки конца строки. Если последний символ, в текстовым файле, не является меткой конца строки, конец текстового файла интерпретируется как конец строки.

Если переменная dobj слишком коротка относительно считываемых символов, лишние символы обрезаются. Если же она длиннее, переменная заполняется пробелами справа. Если же dobj строковая переменная (тип string) в неё передаются только считанные символы.

  • Если файл открыт как бинарный или как бинарный в режиме совместимости, система считывает ровно столько байтов, сколько может уместиться в переменной dobj. Файловый указатель так же перемещается по мере считывания. Если переменная dobj больше размеров файла, она заполняется 16-ричным представлением 0 справа. Если dobj строка, система пытается считать весь файл в переменную.

Если при открытии файла указана необходимость в конвертации кодировок, она срабатывает до присвоения данных переменной, после чего в неё побайтно передаются сконвертированные данные.

Заполнение поля sy-subrc

Для текстовых файлов

sy-subrc Значение
0 Данные считаны до явно определенной метки конца строки или до неявной метки конца строки в конце файла.
4 Была сделана попытка чтения данных после конца файла.

Для бинарных файлов

sy-subrc Значение
0 Данные были считаны; при этом система либо достигла конца файла, либо нет
4 Либо была совершена попытка чтения после конца файла, либо переменная в которую происходит чтение оказалась длиннее его содержимого

Существуют следующие особенности:

  • Так как в не юникодных программах открытие файла может происходить не явно, для них вызывается автоматическая проверка полномочий.
  • Текстовый файл без явно записанных меток конца строки, всегда имеет неявную метку конца строки в конце файла.
  • При переносе цифровых данных или смешанных структур рекомендуется считывать данные в ссылочную переменную байтового типа, присвоенную с помощью дополнения CASTING (ниже будет показан альтернативный способ считывания, непосредственно в байтовый буфер):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

DATA: file TYPE string VALUE `flights.dat`,

      wa   TYPE spfli,

      itab LIKE TABLE OF wa.

FIELDSYMBOLS <hex_container> TYPE x.

OPEN DATASET file FOR INPUT IN BINARY MODE.

ASSIGN wa TO <hex_container> CASTING.

DO.

  READ DATASET file INTO <hex_container>.

  IF sysubrc = 0.

    APPEND wa TO itab.

  ELSE.

    EXIT.

  ENDIF.

ENDDO.

CLOSE DATASET file.

Дополнения:

  • [ACTUAL] LENGTH alen  — записывает считанный объем данных в переменную alen. Для текстовых – количество символов, для бинарных и в режиме совместимости – количество байт.  Слово ACTUAL было введено, чтобы отличать это дополнение от следующего и должно быть всегда использовано.
  • MAXIMUM LENGTH mlen определяет, как много символов (байт) будет считано из файла. Для текстовых – количество символов, для бинарных и в режиме совместимости – количество байт. Пример:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

DATA: file TYPE string VALUE `flights.dat`,

      hex_container TYPE x LENGTH 1000,

      len TYPE i,

      itab          TYPE TABLE OF spfli.

FIELDSYMBOLS <spfli> TYPE spfli.

DESCRIBE FIELD <spfli> LENGTH len IN BYTE MODE.

OPEN DATASET file FOR INPUT IN BINARY MODE.

ASSIGN hex_container TO <spfli> CASTING.

DO.

  READ DATASET file INTO hex_container MAXIMUM LENGTH len.

  IF sysubrc = 0.

    APPEND <spfli> TO itab.

  ELSE.

    EXIT.

  ENDIF.

ENDDO.

CLOSE DATASET file.

Обрабатываемые исключения

CX_SY_CODEPAGE_CONVERTER_INIT

Причина: Желаемое преобразование невозможно. (Либо неверно указана желаемая кодировка, либо указанная кодировка не поддерживается на уровне системы)
Ошибка времени выполнения: CONVT_CODEPAGE_INIT

CX_SY_CONVERSION_CODEPAGE

Причина: Преобразование невозможно.
Ошибка времени выполнения: CONVT_CODEPAGE

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу
Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

CX_SY_FILE_IO

Причина: Ошибка при чтении файла.
Ошибка времени выполнения: DATASET_READ_ERROR

CX_SY_FILE_OPEN

Причина: Файл не был открыт.
Ошибка времени выполнения: DATASET_CANT_OPEN

CX_SY_FILE_OPEN_MODE

Причина: Файл не был открыт для указанного режима.
Ошибка времени выполнения: DATASET_NOT_OPEN

CX_SY_PIPE_REOPEN

Причина: Рабочий процесс, в котором был открыт файл с именованным каналом либо закрыт, либо переключен.
Ошибка времени выполнения: DATASET_PIPE_CLOSED

GET DATASET

Синтаксис:

GET DATASET dset [POSITION pos] [ATTRIBUTES attr].

Данный оператор необходим для получения информации о наборе данных dset. При работе с ним, системное поле с кодом ошибки (sy-subrc) всегда равно 0, однако могут быть вызваны исключения (см. ниже)

Если вызывать оператор без дополнений, он может использоваться для проверки, был ли открыт набор данных ранее, если нет, система вызовет исключение.

Дополнения:

  • POSITION pos  — считывает в переменную pos, с типом i, текущий адрес указателя в файле. Позиция указателя всегда определена в байтах. Если позиция находится в начале файла, значение в переменной будет равно 0. Данное дополнение, не может быть одновременно использовано с описанным выше дополнением FILTER (система вызовет исключение). Для файлов, чей размер превышает 2 ГБ, невозможно получить все позиции указателя в файле. (не хватит диапазона типа i). Пример:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

DATA: file TYPE string VALUE ‘test.dat’,

      text TYPE string, pos TYPE i.

OPEN DATASET file FOR OUTPUT IN TEXT MODE

                             ENCODING DEFAULT

                             WITH SMART LINEFEED.

TRANSFER ‘1234567890’ TO file.

GET DATASET file POSITION pos.

TRANSFER ‘ABCDEFGHIJ’ TO file.

CLOSE DATASET file.

OPEN DATASET file FOR INPUT IN TEXT MODE

                            ENCODING DEFAULT

                            WITH SMART LINEFEED

                            AT POSITION pos.

READ DATASET file INTO text.

CLOSE DATASET file.

  •  ATTRIBUTES attr  — считывает атрибуты открытого набора данных. В качестве attr используется переменная с типом dset_attributes:

attr

Данная структура имеет два компонента, фиксированные атрибуты и изменяемые атрибуты. Изменяемые атрибуты можно поменять с помощью оператора SET DATASET (см. ниже). В следующем примере проверяется, открыт ли файл с дополнением FILTER, если нет, можно считать указатель файла:

DATA: dset TYPE string VALUE ‘test.dat’,

      pos TYPE I, attr TYPE dset_attributes.

OPEN DATASET dset FOR INPUT IN BINARY MODE

                  FILTER ‘uncompress’.

...

GET DATASET dset ATTRIBUTES attr.

IF attrfixedindicatorfilter <> ‘X’.

  GET DATASET dset POSITION pos.

ELSE.

  ...

ENDIF.

CLOSE DATASET dset.

Обрабатываемые исключения

  • CX_SY_FILE_OPEN_MODE — файл не открыт.
  • CX_SY_FILE_POSITION – невозможно получить позицию указателя файла.
  • CX_SY_CONVERSION_OVERFLOW – переменная pos слишком мала, чтобы в неё можно было записать позицию указателя.

SET DATASET

Синтаксис:

SET DATASET dset [POSITION {pos|{END OF FILE}}]
[ATTRIBUTES attr].

Данный оператор позволяет изменять позицию курсора в файле, а так же изменяемые атрибуты набора данных.

Дополнения:

  • [POSITION {pos|{END OF FILE}}] – перемещает указатель файла на позицию указанную в переменной pos, с типом i, либо если указано END OF FILE на конец файла. Если в переменной pos будет 0, указатель переместиться в начало файла, если – 1 в конец. Другие отрицательные значения не разрешается использовать. В зависимости от типа доступа, в котором открыт файл, есть некоторые особенности:
    • Если файл открыт для чтения, и позиция pos будет больше чем длинна файла, указатель будет перемещен вне файла, считать данные не получится до тех пор, пока указатель не будет перемещен в тело файла. Если в не юникодной программе совершить при этом запись, файл с конца будет заполнен 16-ричным представлением 0 до текущей позиции, после чего произойдет запись.
    • Если файл был открыт для записи или изменения и курсор был перемещен за пределы файла, при записи в него, с конца файла до текущей позиции он будет заполнен 16-ричным представлением 0, затем произойдет запись.
    • Если файл был открыт для добавления, позиция указателя в нем всегда остается в его конце.

Данное дополнение не может быть использовано, если файл был открыт с дополнением FILTER. Для файлов более 2 ГБ, невозможно определить позицию указателя.  Произвольное перемещение указателя больше подходит для бинарных файлов, чем для текстовых. В текстовых файлах позиция будет зависеть от кодировки, символов конца строки, использования юникода, а так же метки порядка байт.  Пример использования дополнения:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

DATA: file TYPE string VALUE ‘test1.dat’,

pos TYPE i,

text TYPE string.

OPEN DATASET file FOR OUTPUT IN TEXT MODE

ENCODING DEFAULT

WITH SMART LINEFEED.

TRANSFER: ‘Line1’ TO file,

‘Line2’ TO file,

‘Line3’ TO file.

SET DATASET file POSITION 0.

READ DATASET file INTO text.

SET DATASET file POSITION END OF FILE.

TRANSFER: ‘Line4’ TO file,

‘Line5’ TO file,

‘Line6’ TO file.

CLOSE DATASET file.

  • ATTRIBUTES attr – устанавливает изменяемые атрибуты. Для некоторых из изменяемых атрибутов существуют константы из пула типов DSET:

attr2

Пример:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

DATA: dset TYPE string VALUE ‘test.dat’,

attr TYPE dset_attributes.

OPEN DATASET dset FOR INPUT IN LEGACY TEXT MODE

WITH NATIVE LINEFEED.

...

GET DATASET dset ATTRIBUTES attr.

IF attrfixedmode = ‘T’ OR

attrfixedmode = ‘LT’.

CLEAR attrchangeable.

attrchangeableindicatorconv_errors = ‘X’.

attrchangeableconv_errors = ‘I’.

attrchangeableindicatorlinefeed_mode = ‘X’.

attrchangeablelinefeed_mode = ‘S’.

IF attrfixedmode = ‘LT’.

attrchangeableindicatorcode_page = ‘X’.

attrchangeablecode_page = ‘1100’.

ENDIF.

SET DATASET dset ATTRIBUTES attrchangeable.

ENDIF.

CLOSE DATASET dset.

Обрабатываемые исключения

CX_SY_CODEPAGE_CONVERTER_INIT

Причина: Желаемое преобразование невозможно. (Либо неверно указана желаемая кодировка, либо указанная кодировка не поддерживается на уровне системы)
Ошибка времени выполнения: CONVT_CODEPAGE_INIT

CX_SY_CONVERSION_CODEPAGE

Причина: Изменение символов замены и обработки ошибок возможно лишь для файлов открытых в TEXT MODE или LEGACY … MODE.
Ошибка времени выполнения: CONVT_CODEPAGE

CX_SY_FILE_OPEN_MODE

Причина: Файл открыт на чтение, изменение невозможно
Ошибка времени выполнения: DATASET_READ_ONLY

Причина: Файл не был открыт.
Ошибка времени выполнения: DATASET_NOT_OPEN

Причина: Файл открыт в неподдерживаемом режиме.
Ошибка времени выполнения: DATASET_INCOMPATIBLE_MODE

CX_SY_FILE_POSITION

Причина: Ошибка при смене указателя.
Ошибка времени выполнения: DATASET_SEEK_ERROR

Причина: Нет доступа для смены позиции.
Ошибка времени выполнения: DATASET_NO_POSITION

Причина: Перемещение невозможно на указанную позицию, слишком большая позиция.
Ошибка времени выполнения: DATASET_OFFSET_TOO_LARGE

Не обрабатываемые исключения

Причина: Невозможно изменить позицию для именованного канала.
Ошибка времени выполнения: DATASET_PIPE_POSITION

TRUNCATE DATASET

Синтаксис:

TRUNCATE DATASET dset AT {CURRENT POSITION}|{POSITION pos}.

С помощью данного оператора можно изменить размер файла (уменьшить или увеличить). Уменьшается когда позиция указателя после AT меньше текущего размера файла, увеличивается, когда больше. При увеличении размера файл заполняется 16-ричным представлением 0.

Оператор можно использовать, если файл открыт на запись, изменение или дополнение, а так же не указано дополнение FILTER.

Оператор всегда возвращает sy-subrc равное 0, либо вызывает исключение. Оператор не устанавливает новую позицию для указателя в файле. Если файл открыт для добавления, указатель перемещается непосредственно перед записью в файл.

Дополнения:

  • CURRENT POSITION  — устанавливает конец в файла в текущей позиции
  • POSITION pos – устанавливает конец файла в указанной в pos позиции. В pos может быть передана любая числовая переменная, если её значение целое и не отрицательное.

Пример использования оператора TRUNCATE:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

DATA: name TYPE string VALUE `test.dat`,

      hex  TYPE xstring.

hex = ‘FFFF’.

OPEN DATASET name FOR OUTPUT IN BINARY MODE.

TRANSFER hex TO name.

SET DATASET name POSITION 0.

READ DATASET name INTO hex.

TRUNCATE DATASET name AT POSITION 1.

SET DATASET name POSITION 0.

READ DATASET name INTO hex.

TRUNCATE DATASET name AT POSITION 2.

SET DATASET name POSITION 0.

READ DATASET name INTO hex.

CLOSE DATASET name.

После первого вызова оператора в файле останется значение «FF», после второго «FF00».

Обрабатываемые исключения

CX_SY_FILE_OPEN

Причина: Файл не был открыт.
Ошибка времени выполнения: DATASET_NOT_OPEN

Причина: Файл открыт только для чтения.
Ошибка времени выполнения: DATASET_READ_ONLY

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу
Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

CX_SY_FILE_POSITION

Причина: Указана неверная позиция.
Ошибка времени выполнения: DATASET_OFFSET_TOO_LARGE

CX_SY_FILE_TRUNCATE

Причина: ОС не может изменить размер файла.
Ошибка времени выполнения: DATASET_TRUNCATE_ERROR

Причина: Невозможно изменить размер файла, открытого с дополнением FILTER.
Ошибка времени выполнения: DATASET_TRUNCATE_ERROR

Не обрабатываемые исключения

Причина: Внутренняя ошибка.
Ошибка времени выполнения: DATASET_TRUNCATE_ERROR

CLOSE DATASET

Синтаксис:

CLOSE DATASET dset.

Оператор закрывает набор данных. Если файл уже был закрыт или еще не открыт, система игнорирует данный оператор, sy-subrc равен 0.  Если в ОС используется буфер при изменении файла, все что было в нем, переносится в файл.  Если при закрытии программы не было явного вызова закрытия набора данных, он закрывается автоматически.

Если файл открыт с дополнением FILTER, при его закрытии sy-subrc содержит код возврата из именованного канала, возвращаемый ОС. Если не было исключений sy-subrc равно 0.

Обрабатываемые исключения

CX_SY_FILE_CLOSE

Причина: Файл не был закрыт. Возможной причиной является недостаток памяти.
Ошибка времени выполнения: DATASET_CANT_CLOSE

DELETE DATASET

Синтаксис:

DELETE DATASET dset.

Удаляет указанный файл, при этом он может быть закрыт или открыт.  Если имя файла приходит извне, оно может нести серьезный риск из-за обхода директорий (см. выше) и требует дополнительной проверки.

Если значение поля sy-subrc равно 0, файл был удален. Если значение поля sy-subrc равно 4, файл не был удален.

Обрабатываемые исключения

CX_SY_FILE_AUTHORITY

Причина: Нет доступа к файлу
Ошибка времени выполнения: OPEN_DATASET_NO_AUTHORITY

CX_SY_FILE_OPEN

Причина: Файл не может быть открыт
Ошибка времени выполнения: DATASET_CANT_OPEN

Дополнительные операции при работе с файлами

Файловый интерфейс ABAP не предоставляет таких возможностей, как: переименовать файл (без его копирования в другой файл), листинга в директориях на сервере приложений,  копирования файла без его полного считывания через сервер приложений и др. Большинство этих операций выполняются на уровне системных команд сервера приложений, таких как: cp, mv, mkdir и других.

Для демонстрации работы данных операций можно посмотреть программу ZAL11, которая является заменой стандартной тр. AL11, но с более продвинутыми возможностями:

zall11

Так, например, выглядит процедура копирования (перемещения) файла (директории):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

*&———————————————————————*

*&      Form  COPY_ITEM

*&———————————————————————*

*       Copy or move remote file/folder

*———————————————————————-*

*      —>PW_NAME        File/folder to move/copy

*      —>PW_PATH_TARGET Target folder

*      —>PW_ACTION      Move : 2, copy : 1

*      —>PW_TYPE        0=file, 1=folder

*———————————————————————-*

FORM copy_item USING pw_name TYPE c

                     pw_path_target TYPE c

                     pw_action TYPE i

                     pw_type TYPE i.

  DATA : lw_command(1000) TYPE c,

         lw_action(1) TYPE c,

         lw_name TYPE string,

         lw_target TYPE string.

* Authority check for move/copy files

  IF s_authmove_file NE c_true AND pw_type = 0.

    MESSAGE ‘You are not allowed to perform this action’(e21)

            TYPE ‘S’ DISPLAY LIKE ‘E’.

    EXIT.

  ENDIF.

* Authority check for move/copy folders

  IF s_authmove_folder NE c_true AND pw_type = 1.

    MESSAGE ‘You are not allowed to perform this action’(e21)

            TYPE ‘S’ DISPLAY LIKE ‘E’.

    EXIT.

  ENDIF.

  CONCATENATE ‘»‘ pw_name ‘»‘ INTO lw_name.

  CONCATENATE ‘»‘ pw_path_target ‘»‘ INTO lw_target.

* Confirm action on remote server

  IF pw_action = 1.

    lw_command = ‘Are you sure you want to copy # into # ?’(t01).

  ELSE.

    lw_command = ‘Are you sure you want to move # into # ?’(t02).

  ENDIF.

  REPLACE FIRST OCCURRENCE OF c_wildcard IN lw_command WITH lw_name.

  REPLACE FIRST OCCURRENCE OF c_wildcard IN lw_command WITH lw_target.

  PERFORM confirm_action USING lw_command CHANGING lw_action.

  IF lw_action = space.

    EXIT.

  ENDIF.

  IF pw_action = 1.

* Server command to copy file/folder

    CONCATENATE ‘cp -r’ lw_name lw_target INTO lw_command

                SEPARATED BY space.

  ELSE.

* Server command to move file/folder

    CONCATENATE ‘mv’ lw_name lw_target INTO lw_command

                SEPARATED BY space.

  ENDIF.

  CALL ‘SYSTEM’ ID ‘COMMAND’ FIELD lw_command.

* If application server is too fast, file server is not updated

* before querriing. Wait 1 second after server action

  WAIT UP TO 1 SECONDS.

ENDFORM.

Вызов системных команд подобным образом, не является безопасным, подробнее читайте в блоге.


Форум программистов Vingrad

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> ошибка — Dataset Open. Interbase 7.5 C++ Builder 

:(

   

Опции темы

SAnatoliy
Дата 15.5.2009, 08:07 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 79
Регистрация: 1.10.2007

Репутация: нет
Всего: нет

Что делаю не так?

Ошибка: сообщение: www.Amyulet.narod.ru/222.JPG

user posted image

Код

AnsiString aB1,aB2;
DataModule1->IBDataSet2->Open();

  for(DataModule1->IBDataSet2->First(); !DataModule1->IBDataSet2->Eof;
      DataModule1->IBDataSet2->Next()) {

      aB1 = DataModule1->IBDataSet2->FieldByName("TEL_OLD")->AsString.c_str();
      aB2 = DataModule1->IBDataSet2->FieldByName("TEL_NEW")->AsString.c_str();

        DataModule1->IBDataSet1->Open();
        DataModule1->IBDataSet1->Edit();
        DataModule1->IBDataSet1->ModifySQL->Clear();
        DataModule1->IBDataSet1->ModifySQL->Add((AnsiString)"update tabl_main set NUM_ABON2='"+aB2+"' where NUM_ABON2='"+aB1+"' and DATA_IMP='"+SDate+"'");
        DataModule1->IBDataSet1->Post();
  }

Это сообщение отредактировал(а) SAnatoliy — 15.5.2009, 11:00

PM MAIL   Вверх
jonie
Дата 15.5.2009, 11:14 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 4
Всего: 118

мне кажется что вы используете пессиместическую блокировку и в рамках открытой блокировки, пытаетесь обновить эту же запись… Нет? Нужно либо использовать IBDataSet2 объекты для изменения, либо убирать блокировки (читай закрывать IBDataSet2)…..

———————

Что-то не поняли? -> Напейтесь до зеленых человечков… эта сверхцивилизация Вам поможет…

PM MAIL Jabber   Вверх
SAnatoliy
Дата 15.5.2009, 12:32 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 79
Регистрация: 1.10.2007

Репутация: нет
Всего: нет

у меня есть таблица1 в ней порядка 50 000 записей. С полями Abon1 и Abon2.
            есть таблица2 в ней порядка 10 записей с полями: N_Old и N_New.

Нужно найти в таблице1 в поле Abon2 одинаковые значения с Таблица2 -> N_Old, если найдено то заменить значением N_New->Таблица2. Искать в записях за определенное число (DATA_IMP='»+SDate).

 Как это реализовать?

PM MAIL   Вверх
jonie
Дата 25.5.2009, 22:08 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 4
Всего: 118

постараюсь ответить, хотя могу велосипедить… мб кто поправит.
выполнить на базе примерно такой запрос:

Код

update t1
set N_Old=t2.N_New
from table1 t1
inner join table2 t2 on t1.Abon2 = t2.N_Old AND [email protected]

?
правда я не знаю как это будет в диалекте IB….

а для вашего случая (руками делать join и чета там обновлять) очевидно придется сначала найти все ID, затем отключить ResultSet (rs.close() вызвав), и начать обновлять таблицу1 по этим ID … как-то так, насколько я знаю IB не поддерживает MARS-like (http://technet.microsoft.com/en-us/library/ms345109(SQL.90).aspx) запросы….

Это сообщение отредактировал(а) jonie — 25.5.2009, 22:11

———————

Что-то не поняли? -> Напейтесь до зеленых человечков… эта сверхцивилизация Вам поможет…

PM MAIL Jabber   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «C++: Базы данных»
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »

Когда я попытался использовать FireDAC FDQuery с базой данных MySQL, я получил следующую ошибку:

Cannot perform this operation on an open dataset.
query.Open(....my connection string to MySQL....); 
try
    query.ExecSql;
finally
    query.Close;

Я заполнил FDQuery, дважды щелкнув значок в форме. Я также подключился к базе данных, чтобы проверить это. Он вернул результаты правильно. Я хотел бы использовать его из кода, но он не работает, поэтому я отладил его. Я всегда добираюсь до точки останова: query.Close;

07 март 2019, в 14:13

Поделиться

Источник

2 ответа

Вы не можете вызывать Open и ExecSQL на одном и том же SQL, потому что они делают разные вещи.

Используйте Open когда запрос вернет набор результатов, что означает SELECT. Используйте ExecSQL когда запрос не возвращает результирующий набор, что означает INSERT, DELETE или UPDATE.

Я не могу сказать вам, какое из них применимо к вашей ситуации, потому что вы не включили свой SQL в свой пост.

Ken White
07 март 2019, в 10:12

Поделиться

Я не знаю конкретно о FireDAC, но в целом с такими компонентами базы данных, для запросов, не возвращающих набор результатов, таким образом, подходящих для ExecSQL, вы хотели бы использовать ExecSQL для объекта Connection, в данном случае TFDConnection. (Предположительно, это будет объект Connection, к которому подключен ваш объект FDQuery.) Http://docwiki.embarcadero.com/RADStudio/Rio/en/Executing_Commands_(FireDAC) Очевидно, что в TFDCustomQuery есть метод ExecSQL, но я не знаю, зачем вы это используете, и, как вы обнаружили, он не работает, если запрос уже используется.

gwideman
20 апр. 2019, в 04:35

Поделиться

Ещё вопросы

  • 0Как вставить элементы в массив контроллера, используя форму с полями ввода, и это будет отображаться в представлении
  • 0.fadeIn () не запускается в версии IE менее 9
  • 0Подменю на заказ JQuery
  • 0Перетаскивание JQuery не показывает перетаскиваемый элемент после добавления в список
  • 0Как я могу избежать семантической связи для создания многоразового движка дисплея?
  • 0window.location.href или $ (location) .attr (‘href’) и польские диакритические знаки
  • 0AngularJS — использование ng-модели на флажке и включение / выключение его через контроллер
  • 1ASP.NET Validator для нескольких полей
  • 0Используйте mousedown и перетащите, чтобы увеличить изображения миниатюр?
  • 1Отображение сообщения загрузки WPF до завершения обновления пользовательского интерфейса
  • 1Получение файлов из программных файлов
  • 0Тестирование углового модала открытое обещание
  • 1JavaScript — среднее число из массива с использованием функции Reduce
  • 0jQuery jeditable Не удается прочитать свойство «плагин» неопределенного при попытке использовать datetimepicker
  • 1Как передать аргумент функции в привязке данных?
  • 0Javascript моя функция не будет работать во второй раз, когда он нажал
  • 0не добавлять дубликаты в корзину
  • 0Возникли проблемы при запуске с AngularJS
  • 0Как добавить все DIV начинается с класса и повторить этот процесс снова?
  • 0Как читать символы из txt файла в 2d массив C ++
  • 0Как открыть вторичную ссылку IFRAME на Первичную ссылку IFRAME?
  • 1Android — сопоставить родительский элемент при просмотре видео
  • 0Чтение строки из переменной для SQL-запроса
  • 1Как я могу сделать цикл в XML-файле, который я получаю значение Attributte?
  • 1Как составить список строк
  • 1Можно ли выполнить условную сортировку по двум различным столбцам, но где порядок двух столбцов меняется на обратный в зависимости от вторичного условия?
  • 0Событие при нажатии на <td> создается динамически
  • 0angularjs ui-router что-то в коде
  • 0Как изменить значения из CSV в SQL с помощью switch-case
  • 0Как перенаправить пользователя обратно на предыдущую страницу после входа в систему?
  • 0Как закрыть всплывающее окно при нажатии в любом месте на сайте
  • 0Скрыть элемент при заполнении поля формы
  • 0Проблема с боковой панелью навигации
  • 1Круглый значок не отображается на Зефир
  • 1Как условно покрасить ячейки Excel вывода в Python?
  • 0Выделение активного пункта меню в блоггере блоггера с помощью JavaScript
  • 1Групер и ось должны быть одинаковой длины в Python
  • 1Java конвертировать текстовый файл UTF-8 в Cp1250
  • 0Как реализовать скриптовые события для дизайна видеоигр?
  • 1Не удается импортировать модули в подкаталог
  • 1Эффективный для памяти способ хранения значений bool и NaN в пандах
  • 0о removeClass из родительского элемента
  • 1Получить значение даты и времени из таблицы SQL Server с помощью C # Sql Reader
  • 1Код бегуна Фибоначчи: JAVA
  • 1Android Retrofit2 / RxJava2 / Room — Простая обработка данных
  • 1Начать конец вызова асинхронного метода
  • 1Как мне получить размеры холста в tkinter?
  • 0JQuery: получение данных не работает
  • 0Плагин jQuery Validation — добавление класса ошибок к дополнительным элементам
  • 0Передача данных между 2 окнами. Qt

Сообщество Overcoder

Понравилась статья? Поделить с друзьями:
  • Datakom dkg 116 ошибки запуска
  • Datagate параграф ошибка авторизации
  • Dataframe constructor not properly called ошибка
  • Datachannel dll ошибка торрента
  • Database exception 2002 возникла внутренняя ошибка сервера