Найти значения в ячейках таблицы с помощью Javascript

Как писал Ричард, макросы в стиле функции испускают код SAS. Общее правило разработки макросов в стиле функции заключается в том, что они содержат только макроязычные выражения. Любой код SAS, который они содержат, будет испускаться. Исторически сложилось так, что это затруднило / раздражало написать макрос функционального стиля, который обрабатывал бы данные, подобные тому, который вы делали бы с помощью шага DATA. К счастью, SAS добавила функцию DOSUBL, которая упрощает запись макросов в стиле функции, которые выполняют код SAS в «боковом сеансе» и испускают результат. См. Статью Рика Лэнгстона .

Вот пример макрофайла в стиле функции, который использовал DOSUBL для подсчета количества записей в таблице и испускает счет. (Это очень неэффективный способ получить показатель записи, просто пример выполнения чего-то в SQL).

%macro SQLcount(table);
  %local rc emit; 

  %let rc=%sysfunc(dosubl(%nrstr(
     proc sql noprint;
      select count(*) into :emit trimmed
      from &table
     quit;
  )));

  &emit 
%mend ;

Его можно использовать как:

proc sql ;
  select name
        ,%SQLcount(sashelp.shoes) as ShoeCount  /*emits 395*/
  from sashelp.class
  ;
quit ;

Когда вышеперечисленный шаг запускается, он вернет 19 строк имен из sashelp.class, а значение ShoeCount будет 395 в каждой строке. Обратите внимание, что макрос SQLcount выполняется только один раз. В то время как этап PROC SQL компилируется / интерпретируется, вызов SQLcount просматривается и выполняется макрос и испускает 395. Шаг становится:

proc sql ;
  select name
        ,395 as ShoeCount  /*emits 395*/
  from sashelp.class
  ;
quit ;

DOSUBL использует «боковой сеанс» для выполнения кода, который позволяет выполнить шаг PROC SQL в боковом сеансе, в то время как основной сеанс интерпретирует шаг PROC SQL.

Я не могу сказать из вашего вопроса, подходит ли этот вариант использования. Возможно, вам нужен макрос функционального стиля, в котором вы могли бы передавать ему значения из таблицы, и макрос выполнялся по каждому значению и возвращал что-то. Предположим, что у вас была таблица, которая была списком имен таблиц, и хотела использовать SQL для подсчета записей в каждой таблице:

data mytables ;
  input table $20. ;
  cards ;
sashelp.shoes
sashelp.class
sashelp.prdsale
;
quit ;

Вы можете сделать это, используя функцию resolve (), чтобы вызывать макросы на основе данных, задерживая выполнение макроса до выполнения оператора SELECT:

proc sql ;
  select table
        ,resolve('%SQLcount('||table||')') as count
  from mytables
  ;
quit ;

При этом SQLcount будет вызываться три раза и будет возвращать количество записей в каждом наборе данных.

table                 count
---------------------------
sashelp.shoes         395
sashelp.class         19
sashelp.prdsale       1440

Вызов макроса не отображается, когда интерпретируется шаг PROC SQL, поскольку он скрыт одиночными кавычками. Затем функция разрешения вызывает макрос, когда выполняется оператор SELECT, передавая значение table в качестве значения параметра, а макрос испускает счетчик записей. Это похоже на подход CALL EXECUTE для использования данных для вызова макросов.

0
задан Brian Tompsett - 汤莱恩 19 January 2019 в 13:25
поделиться

1 ответ

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

$(function() {
  var idCountry = "9";
  var nameCountry = "United States";
  var idCompany = "9";
  var nameCompany = "Genentech";

  var tBody = $("#tablaAplicaciones > tbody");

  //Create Row
  var row = $("<tr>");

  //Add Country cell to Row
  $("<td>", {
      class: "name-country"
    })
    .data("id", idCountry)
    .html(nameCompany)
    .appendTo(row);

  //Add Company cell to Row
  $("<td>", {
      class: "name-company"
    })
    .data("id", idCompany)
    .html(nameCompany)
    .appendTo(row);

  // Assume vales are not in the table
  var found = -1;

  $("tr", tBody).each(function(i, el) {
    // Test each row, if value is found set test to tue
    if ($(".name-country", el).text().trim() == nameCountry) {
      found = i;
    }
    if ($(".name-company", el).text().trim() == nameCompany) {
      found = i;
    }
  });

  if (found == -1) {
    // If test is false, append the row to table
    row.appendTo(tBody);
    console.log("Row Added", row);
  } else {
    console.log("Values already in Table, row: " + found);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="tablaAplicaciones">
  <thead>
    <tr>
      <th>Country</th>
      <th>Company</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td data-id="1" class="name-country">United States</td>
      <td data-id="1" class="name-company">Apple Inc.</td>
  </tbody>
</table>

Используя .each(), вы можете выполнять итерации по каждой строке и сравнивать значения. Переменная может использоваться в качестве флага, чтобы указать, была ли найдена игла в стоге сена. Если не найдено, вы можете добавить строку. В противном случае не добавляйте строку.

Надеюсь, что это помогает.

0
ответ дан Twisty 19 January 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: