Missing join in workbook

Client exported a business prior to making modifications. The modifications were not going well, so they restored by importing the business area. During import, the selection was made to rename the existing objects. So now there are 2 BAs "BA" and "BA 1". BA is the pre-modification business area, and "BA 1" contains the modifications. The client then deleted "BA 1" thinking everything would be restored prior to the modifications.
They aren't. To further complicate things, several folders in the business area were shared with other business areas (so now there are "Folder 1" objects all over the place). When users open workbooks, they are getting the error:
Cannot join tables used in the workbook. Join "" not found in the EUL.
Running the workbook dump utility (d51wkdmp) throws:
DCEException - Internal EUL Error: InvalidId - Failed to find EUL element by id
Any ideas on how to find out which join(s) are missing, or a way to gracefully back out the export/import that took place?

Boy, what a mess. I am thinking if it would be possible to delete business areas BA and BA1, then reimport the pre-modification business area. The concern I would have is if the folders in this business area BA are also used in other business areas. If just BA and BA1, then I think you would be okay. But if used in BA, BAC, BAD, BAE, and so forth, then you have to be careful.
When they deleted business area BA1, do they remember what option they selected? Was it delete the business area and its folders option? Kind of sounds like that is what happened. If you do that and the folders are used in other business areas, they should not get removed. But since you did the rename option on the import, those existing folders would have been renamed and if not used in any other business area, would have been deleted.
The problem is that Discoverer tends to work off its internal id values, not the names. So the original folders and joins and stuff would have had unique internal id values that your workbooks are looking for. The reimported business area, though it has the right names, would have new internal id values, that the workbooks do not know about, and thus the problems you are having now.
Now I admit that is guessing on my part. I know the internal id values are there and would be unique. Exactly how Discoverer tracks its join usage in workbooks, that part I have never seen any documentation on.
This may be something where you want to log a service request with Oracle support and see what they suggest on how to best recover from this situation. Those would be the folks who would best understand the internal (behind the scene) workings of Discoverer.
Good luck.
John Dickey

Similar Messages

  • [nQSError: 14044] Missing join between logical tables

    Hi All,
    I have three physical tables:
    A- Dimension (Contact) B- Helper (Con-Prod) C- Dimension (Product). 'A' joins to facts.
    Relationships are:
    A:B=1:M and B:C=N:1
    Currently a column of B table has been implemented as MLOV. As a result now I have one additional MLOV physical table 'D' that joins to 'B' (Since its B.MLOV_WID=D.MLOV_WID , its not a foreign key join).
    The Logical Layer has three Logical tables: A, B and C as in the Physical Layer. B table has got one new LTS for 'D'.
    Now the Problem is when I take a column that is sourced from D and another from C, it generates an error in Answers: Missing join between logical tables B and C. I have verified that the Logical and Physical joins exist.
    I think this is something with the Logical level setup. So here's some more information on hierarchy setup. I have one Hierarchy (Contact) for all those Logical tables. I have setup Level for the MLOV column. I don't have level setup for most of the non-MLOV columns.
    Can you please share your thoughts? I would like to avoid implicit join method.

    Hi,
    It seems like you are pulling a report from 2 tables with NO physical join.
    Please check the physical layer diagram and join the 2 tables.
    Thanks,
    Vineeth

  • How to join two workbooks in one?

    Hi Gurus,
    Is it possible to mix two workbooks without loose BW Connection ?
    I created one workbook (Called "X") and another workbook (Called "Y"). Each of them is based on the same query.
    I used the function copy sheet but after the copy the sheet only have an excel-function
    Could you please help finding the solution?
    Thank you in advance
    Cheers

    Hi Gilo,
    You can't mix the workbooks since they are created seperately and having different workbook IDs,but you can mix the worksheets.
    If your requirement is showing the same query in different pages,then you can create a single workbook and have multiple worksheets.Each worksheet will have a same query in different formats.
    You can make a copy of the worksheet without losing BW Connection and options.
    To perform this,you can go to Tools->Copy Sheet of Analysis Toolbox.This will create an exact copy of worksheet to new sheet,so that you will have same query in different worksheets.I mean Sheet1 and Sheet2 will have same query.
    Let me know in case of any clarifications.
    Rgds,
    Murali

  • Missing Roles in workbook

    The basis team installed the Enchancement Package on BW Sandbox last month.  When I tried to open the workbook, it only show only one role, but it should be showing others roles.   Also, when I tried to save a workbook and assign to a role, I do see the complete list of the roles.
    On the SAP menu (backend tools), I do see complete list of the roles on the user menu.  I did check the user setting and its roles, and the roles are active (not expired).
    I am wondering how to fix the problem, and I am wondering will the latest support pack for frontend will solve it or what other thing we need to do?

    Hi Glenn,
    Please check the following:
    The settings in SSM_CUST defines a compress mechanism for the user menu
    known as "Redundancy avoidance" and described in notes 357877 and 357693
    Redundancy avoidance deletes easy access menu entries for doubled
    transaction codes whenever SSM_CUST contains
    1. an entry CONDENSE_MENU with PATH = 'YES' and
    2. either an entry DELETE_DOUBLE_TCODE with PATH = 'YES' or no entry
    DELETE_DOUBLE_TCODES, at all.
    If you don't want doubled transaction codes to be deleted, then simply
    add an entry DELETE_DOUBLE_TCODES with PATH = 'NO' into table SSM_CUST.
    Please enter
    DELETE_DOUBLE_TCODES with PATH = 'NO' into table SSM_CUST
    and retest this issue...
    many thanks
    Orla.

  • Missing Join function

    One of our home computers does not display the Join Tracks function when trying to copy from a CD. It was there before but it just sort of 'went away'. The function works fine on the other home computer. The computer that does not work runs Windows 7 Pro 64 bit O/S.

    Make sure the CD is displayed with the tracks in numerical order, and that the tracks you want to join are highlighted.  Then click on Options, and it will appear as pictured below.

  • Need help with an Outer Join

    I have the following query which has an outer join and it works perfectly and shows publication paragraph which don't have any maintenance records with a value of 0.
    However when I add to the where clause conditions such as lpm.fac_ident and lpm.start_date, the null values no longer show up in the query(see second SQL statement).
    I am new at SQL and am just trying to make this outer join work. Any help would be appreciated.
    -- THIS WORKS
    SELECT m.publication_paragraph, pm.description, pm.frequency, count(l.publication_paragraph) ACTIVITIES_PERFORMED
    FROM lpm_paragraph_mapping_table m, lpm l, pm_requirements_table pm
    WHERE m.paragraph_alias_mapping = l.publication_paragraph (+)
    GROUP BY m.publication_paragraph, pm.description, pm.frequency
    order by count(l.publication_paragraph);
    -- THIS DOES NOT WORK
    SELECT m.publication_paragraph, pm.description, pm.frequency, count(l.publication_paragraph) ACTIVITIES_PERFORMED
    FROM lpm_paragraph_mapping_table m, lpm l, pm_requirements_table pm
    WHERE m.paragraph_alias_mapping = l.publication_paragraph (+)
    AND l.fac_ident = 'EWR' AND TO_CHAR(l.start_date, 'YYYY') = '2010'
    GROUP BY m.publication_paragraph, pm.description, pm.frequency
    order by count(l.publication_paragraph);
    Edited by: George Heller on Jun 30, 2011 9:47 AM

    fabio_silva wrote:
    Hi,
    I just didn't get. The table (pm_requirements_table pm) haven't any join ???
    Regards,Forgive the ASCII art, but your query looks like:
    ----------  JOIN ----------
    | Alias M | ====> | Alias L |
    | Alias PM |
    ----------- The table pm_requirements_table is not joined at all. Unless it has only a single row, then your resultset will have 1 row for each row in lpm_paragraph_mapping_table (because of the outer join) times the number of rows in pm_requirements_table. Consider this simplified example.
    SQL> select * from t;
            ID DESCR
             1 T 1
             2 T 2
    SQL> select * from t1;
            ID DESCR
             1 T1 1
             2 T1 2
             3 T1 3
             4 T1 4
    SQL> select 1.id, t.descr, t1.descr
      2  from t, t1;
            ID DESCR      DESCR
             1 T 1        T1 1
             1 T 1        T1 2
             1 T 1        T1 3
             1 T 1        T1 4
             1 T 2        T1 1
             1 T 2        T1 2
             1 T 2        T1 3
             1 T 2        T1 4Here, my table t is the result from your join between lpm_paragraph_mapping_table and lpm. My table t1 is your pm_requirements_table. You need something more like:
    SQL> select 1.id, t.descr, t1.descr
      2  from t, t1
      3  where t.id = t1.id;
            ID DESCR      DESCR
             1 T 1        T1 1
             1 T 2        T1 2Assuming you fix that join, you can use a sub-query to apply the predicates to the lpm as Centinul showed, or, if you are on a current version of Oracle, use ANSI join syntax wich would look something like:
    SELECT m.publication_paragraph, pm.description, pm.frequency,
            count(l.publication_paragraph) ACTIVITIES_PERFORMED
    FROM lpm_paragraph_mapping_table m,
       LEFT JOIN lpm l,
          ON m.paragraph_alias_mapping = l.publication_paragraph and
             l.fac_ident = 'EWR' AND
             TO_CHAR(l.start_date, 'YYYY') = '2010'
       JOIN pm_requirements_table pm
          on something
    GROUP BY m.publication_paragraph, pm.description, pm.frequency
    ORDER BY count(l.publication_paragraph);Leaving aside the missing join, the reason why your query as posted does not work is that when there is not a match on m.paragraph_alias_mapping = l.publication_paragraph Oracle will "make up" rows form lpm with all null columns for each row in lpm_paragraph_mapping_table where there is no match. So, when you compare those made up rows from lpm, you are effectively saying where NULL = 'EWR' and TO_CHAR(NULL, 'yyyy') = '2010'. Null is never equal to anything. Any comparision against null is unknown, so the made up rows get filtered out by your predicate.
    John

  • Default parameters are missing in the cloned EUL

    we have discoverer up and running perfectly on our existing instance - SIGMA
    now we have a new instance - ALPHA,
    we cloned the whole EUL from old instance(SIGMA),
    IN ALPHA every thing is working fine, we have all the BA,folders and all the workbooks seem to work fine, but we have a issue with the default parameters.
    the default parameters are missing from the workbooks, now this has become an big issue, because we have hundreds of reports and user want need them all with the default parameters
    could somebody please help me on this issue
    few questions:
    when cloned does the default parameters get erased??
    Does the default parameters entered in the workbook get saved anywhere in the EUL_Tables??
    Could you please give me a best approach to bring in thoese default parameters??
    any thoughts are highly appreciated
    note: i can edit the worksheet and enter the default parameter and save the worksheet but we have got some hundreds of workbooks

    Hi,
    when cloned does the default parameters get erased??I would be surprised if the default parameters are erased. More likely is that they are not being used because the default value is not valid anymore or because Discoverer is trying to use the last parameter value. Check the value of the SaveLastUsedParamValue preference setting. Is this the same on Desktop, viewer and Plus?
    Does the default parameters entered in the workbook get saved anywhere in the EUL_Tables??The default parameters will be save along with the workbook in the EUL5_DOCUMENTS table. The field is of type LONG RAW so you won't easily be able to see this field. You can use the workbook dump utility to check whether there are default parameters actually set up in the workbook.
    Could you please give me a best approach to bring in thoese default parameters??You could try exporting and importing the workbooks into the new environment to see whether this fixes the issue.
    Rod West

  • Matching HR and AD records on 2 attributes, then modify the join attribute?

    Hi,
    We are introducing FIM into an environment consisting of an HR system and AD, with no so happy data. I know that data integrity is key, but there are people above that want some results....so....
    The only match between the existing HR and AD data we can find is the 'firstname' & 'surname' attributes. Lets assume for now that there are no duplicate 'firstname' & 'surname' attributes in HR and AD...could we join the records on 2 attributes
    of 'firstname' & 'surname'?
    Once the records are joined, we would then flow the 'employeeID' attribute from HR to AD.
    Could we then remove the 'firstname' & 'surname' join rule and replace it with 'employeeID' attribute join rule?
    Thank you,
    SK

    Yes, or even leave the name-based join there but lower in precedence than the employeeID one. In practice the problem with name-based joins is not just the obvious one of duplicates but more often that the entry in AD has been created with a preferred
    first name (e.g. Dave) whereas the HR one has the legal first name (e.g. David), leading to missed joins.

  • Strugling  with a join query

    Hello all
    I have a query here: For each country in "America", give the highest mountain and its height; ordered by height. and tables:
    encompasses : country,continent
    geo_mountain: mountain,country
    mountain:name,height
    i wrote so:
    select co.country,mo.name, max(mo.height) as mheight
       from mountain mo, encompasses co
           join geo_mountain gmo
           on mo.name=gmo.mountain
      where  gmo.country=any (select country from encompasses where continent='America')
        GROUP BY co.country,mo.name
        order by mheight;but i get a lot of results, please rewrite my query if possible
    --  File created - Wednesday-May-01-2013  
    --  DDL for Table ENCOMPASSES
      CREATE TABLE "INTERN"."ENCOMPASSES" ("COUNTRY" CHAR(2), "CONTINENT" VARCHAR2(20), "PERCENTAGE" NUMBER)
       COMMENT ON COLUMN "INTERN"."ENCOMPASSES"."COUNTRY" IS 'the country code'
       COMMENT ON COLUMN "INTERN"."ENCOMPASSES"."CONTINENT" IS 'the continent name'
       COMMENT ON COLUMN "INTERN"."ENCOMPASSES"."PERCENTAGE" IS 'percentage, how much of the area of a country belongs to the
                continent'
       COMMENT ON TABLE "INTERN"."ENCOMPASSES"  IS 'information to which continents a country belongs'
    REM INSERTING into INTERN.ENCOMPASSES
    SET DEFINE OFF;
    Insert into INTERN.ENCOMPASSES (COUNTRY,CONTINENT,PERCENTAGE) values ('ag','America',100);
    Insert into INTERN.ENCOMPASSES (COUNTRY,CONTINENT,PERCENTAGE) values ('tt','America',100);
    Insert into INTERN.ENCOMPASSES (COUNTRY,CONTINENT,PERCENTAGE) values ('us','America',100);
    --  File created - Wednesday-May-01-2013  
    --  DDL for Table GEO_MOUNTAIN
      CREATE TABLE "intern"."GEO_MOUNTAIN" ("MOUNTAIN" VARCHAR2(30), "COUNTRY" CHAR(2), "PROVINCE" VARCHAR2(40))
       COMMENT ON COLUMN "intern"."GEO_MOUNTAIN"."MOUNTAIN" IS 'the name of the mountain'
       COMMENT ON COLUMN "intern"."GEO_MOUNTAIN"."COUNTRY" IS 'the country code where it is located'
       COMMENT ON COLUMN "intern"."GEO_MOUNTAIN"."PROVINCE" IS 'the province of this country'
       COMMENT ON TABLE "intern"."GEO_MOUNTAIN"  IS 'geographical information about mountains'
    REM INSERTING into intern.GEO_MOUNTAIN
    SET DEFINE OFF;
    Insert into intern.GEO_MOUNTAIN (MOUNTAIN,COUNTRY,PROVINCE) values ('Mt Elbert','us','Colorado');
    Insert into intern.GEO_MOUNTAIN (MOUNTAIN,COUNTRY,PROVINCE) values ('Mauna Kea','us','Hawaii');
    Insert into intern.GEO_MOUNTAIN (MOUNTAIN,COUNTRY,PROVINCE) values ('Borah Peak','us','Idaho');
    Insert into intern.GEO_MOUNTAIN (MOUNTAIN,COUNTRY,PROVINCE) values ('Granite Peak','us','Montana');
    --  File created - Wednesday-May-01-2013  
    --  DDL for Table MOUNTAIN
      CREATE TABLE "intern"."MOUNTAIN" ("NAME" VARCHAR2(30), "HEIGHT" NUMBER)
       COMMENT ON COLUMN "intern"."MOUNTAIN"."NAME" IS 'the name of the mountain'
       COMMENT ON COLUMN "intern"."MOUNTAIN"."HEIGHT" IS 'the height of the mountain'
       COMMENT ON TABLE "intern"."MOUNTAIN"  IS 'information about mountains'
    REM INSERTING into intern.MOUNTAIN
    SET DEFINE OFF;
    Insert into intern.MOUNTAIN (NAME,HEIGHT) values ('Borah Peak',3859);
    Insert into intern.MOUNTAIN (NAME,HEIGHT) values ('Mauna Kea',4205);
    Insert into intern.MOUNTAIN (NAME,HEIGHT) values ('Mt Elbert',4399);im using oracle 11g, ubintu 12.4
    thank you so much
    best,
    david

    Hi,
    there is also a missing join between encompasses and geo_mountain tables.
    If you want to find the highest mountain for each country you can use an analytic function in a subquery and select only the top first for each country in the outer query.
    You have just posted one country (us) so the query is just giving one row in this case:
    SELECT country, name, height
      FROM
       SELECT co.country, mo.name, mo.height
            , ROW_NUMBER() OVER (PARTITION BY co.country ORDER BY mo.height DESC) rn
         FROM mountain mo
              JOIN geo_mountain gmo
                 ON mo.name = gmo.mountain
              JOIN encompasses co
                 ON co.country = gmo.country
        WHERE co.continent =  'America'
    WHERE rn=1;
    COUNTRY NAME                               HEIGHT
    us      Mt Elbert                            4399You can also use the WITH clause if you prefer. I normally do for readability:
    WITH got_ranks AS
       SELECT co.country, mo.name, mo.height
            , ROW_NUMBER() OVER (PARTITION BY co.country ORDER BY mo.height DESC) rn
         FROM mountain mo
              JOIN geo_mountain gmo
                 ON mo.name = gmo.mountain
              JOIN encompasses co
                 ON co.country = gmo.country
        WHERE co.continent =  'America'
    SELECT country, name, height
      FROM got_ranks
    WHERE rn=1;
    COUNTRY NAME                               HEIGHT
    us      Mt Elbert                            4399Regards.
    Al

  • .Dis Files getting errored out while migrating

    Hi
    During migration of a .dis file from one instance to another instance
    while opening a .dis file i am facing this error :
    Cannot join tables used in the workbook.Item dependency "" not found in the EUL.
    Please help me.
    Regards
    Nakul Venkataraman

    First thing to check is that the EULs on both instances are the same. I would suspect that there is a missing join in the target instance between folders.

  • C# Script to open and read an Excel spreadsheet with multiple worksheets

    Can someone provide me the C# syntax and Edit Script to open an Excel spreadsheet with multiple worksheets and then using the data to create and output a .csv file? The multiple worksheets contain different data elements that I'll need to parse out and then
    store as a .csv file that will then be read to pump data into our SQL Server Database.
    Thanks for your review and am hopeful for a reply.
    PSULionRP

    I think this code originally came from Joel, who comes here quite a bit.  I'm not a C# expert, like Joe is, but I think this is pretty close to what you want.
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Excel = Microsoft.Office.Interop.Excel;
    using Microsoft.Office.Interop.Excel;
    using System.IO;
    namespace WindowsFormsApplication2
    public partial class Form1 : Form
    public Form1()
    InitializeComponent();
    private void button1_Click(object sender, EventArgs e)
    Main();
    public void Main()
    string filePath = "C:\\Users\\Ryan\\Desktop\\MainExcel.xlsx";
    Microsoft.Office.Interop.Excel.Application xlobj = new Microsoft.Office.Interop.Excel.Application();
    Workbook w = default(Workbook);
    Workbook w1 = default(Workbook);
    Worksheet s = default(Worksheet);
    Worksheet s1 = default(Worksheet);
    Worksheet xlsht = default(Worksheet);
    xlobj.Visible = true;
    int intItem = 1;
    DirectoryInfo dirSrc = new DirectoryInfo(@"C:\Users\Ryan\Desktop\Test_Folder\");
    foreach (FileInfo ChildFile in dirSrc.GetFiles())
    try
    // Renaming the excel sheet
    w = xlobj.Workbooks._Open(ChildFile.FullName,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing);
    w1 = xlobj.Workbooks._Open(filePath,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing);
    //this doesn't make any sense
    //w1 = xlobj.Workbooks.Open(filePath);
    //if (intItem > 3)
    Excel.Worksheet lastSht =
    (Excel.Worksheet)w1.Worksheets[w1.Worksheets.Count];
    xlsht = (Excel.Worksheet)w1.Worksheets.Add(Type.Missing,
    lastSht,
    Type.Missing, Type.Missing);
    s = (Excel.Worksheet)w.Worksheets[1];
    s1 = (Excel.Worksheet)w1.Worksheets[intItem];
    s1.Name = ChildFile.Name;
    // it will copy and paste sheet from one to another with formula
    s.UsedRange.Copy(Type.Missing);
    Excel.Range r = s1.get_Range("A1", Type.Missing);
    r.PasteSpecial(Excel.XlPasteType.xlPasteValues,
    Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
    Type.Missing, Type.Missing);
    s1.UsedRange.Formula = s.UsedRange.Formula;
    // Renaming the excel sheet
    //w.Save();
    w.Close(false, Type.Missing, Type.Missing);
    w1.Close(false, Type.Missing, Type.Missing);
    catch (Exception ex)
    //w.Save();
    w1.Save();
    w.Close(false, Type.Missing, Type.Missing);
    w1.Close(false, Type.Missing, Type.Missing);
    intItem = intItem + 1;
    //Dts.TaskResult = ScriptResults.Success
    Do you need help getting everything into a CSV, or can you take it from here???
    Knowledge is the only thing that I can give you, and still retain, and we are both better off for it.

  • Distribute eps objects with file list and quantity

    Hello everyone,
    Here's a script i wrote so I share it for the contribution.
    Here's my purpose. Every year, for a customer of our company, we have to print several description plates for their products. They give us about 30 or more texts, traduced in about 7 languages, and an excel file with quantities that each retail seller of each country do want to receive.
    We print these aluminium plates on a uv cured ink printing machine which have a table dimension of about 60x40cm. Preparing manually every files of 60x42cm to print was way too much time devouring, so i wrote that script.
    Before running this script you have to create a folder with your text files in eps, and create a new document with the dimension you want.
    Don't hesitate if you want more precisions with the process.
    #target illustrator
    #targetengine session
    This script allows you to import EPS files as linked files. It distributes them and centers the all according to the dimension of the artboard of your document, then it saves the file.
    You can define everything in the start list : target folder, basename of the destination files, how much objects per sheet you want, the roation if necessary, spacing between each objects, number of culumn for the distribution.
    If you want to distribute a number of objects that is bigger thant the limit of objects per sheet, the script reports the remaining in a new sheet after saving the previous one.
    The first 2 arrays contains the filenames to use in the source folder and their respective quantity.
    var doc = app.activeDocument;
    doc.rulerOrigin = [0,0];
    var xtimes = 0;
    var countName;
    var folder;
    var folder2;
    //var folder = 'C:\\Documents and Settings\\Administrateur\\Bureau\\BBB\\';
    // array for filenames
    var listEx=new Array (
    "File1.eps",
    "File2.eps",
    "File3.eps",
    // array for quantity for each filenames
    var listqte=new Array (
    15,
    8,
    19,
    //-------------UI CODE------------
    var win = new Window ("dialog");
    win.alignChildren = "left";
    // ------Folders selection panel
    var foldPanel = win.add("panel");
    foldPanel.alignChildren = "right";
    // source folder for files
    var panelGrp1 = foldPanel.add("group");
    var btnSource = panelGrp1.add("button",undefined,"Source Folder :");
    var txtSource = panelGrp1.add("edittext",undefined);
    txtSource.characters = 40;
    btnSource.onClick = function()
        folder2 = Folder.selectDialog ("Select Source folder..."); // get the source folder
        txtSource.text = folder2.fsName; // show the file Path here
    // destination folder
    var panelGrp2 = foldPanel.add("group");
    var btnSave = panelGrp2.add("button",undefined,"Save Folder :");
    var txtSave = panelGrp2.add("edittext",undefined);
    txtSave.characters = 40;
    btnSave.onClick = function()
        folder = Folder.selectDialog ("Select Destination folder..."); // get the source folder
        txtSave.text = folder.fsName; // show the file Path here
    // Base name for destination files
    var panelGrp3 = foldPanel.add("group");
    panelGrp3.alignment = "left";
    var bfn = panelGrp3.add("statictext",undefined,"Basename of target file :");
    var txtbfn = panelGrp3.add("edittext",undefined,"Description plates - UK");
    txtbfn.characters = 20;
            // other parameters
            var grp = win.add("group");
            grp.alignChildren = "left";
            grp.orientation = "column";
            // counter
            var wincount = grp.add("group");
            var textcount = wincount.add("edittext",undefined,0);
            textcount.characters=2;
            wincount.add("statictext",undefined,"Start count");
            //Limit number of placeditems to distribute in one file
            var winlimit = grp.add("group");
            var textlimit = winlimit.add("edittext",undefined,0);
            textlimit.characters=2;
            winlimit.add("statictext",undefined,"Limit");
            //number of Columns for the distribution
            var wincolon = grp.add("group");
            var textcolon = wincolon.add("edittext",undefined,0);
            textcolon.characters=2;
            wincolon.add("statictext",undefined,"Nb of columns");
            // Spacing values between each objects in mm
            var winspace = grp.add("panel",undefined,"Spacing in mm");
            winspace.orientation = "row";
            winspace.add("statictext",undefined,"X");
            var Xspace=winspace.add("edittext",undefined,0);
            Xspace.characters=7;
            winspace.add("statictext",undefined,"Y",undefined,0);
            var Yspace=winspace.add("edittext");
            Yspace.characters=7;
            // rotation angle
            var winrotate = grp.add("group");
            var textangle = winrotate.add("edittext",undefined,0);
            textangle.characters=3;
            winrotate.add("statictext",undefined,"Rotation in °");
    // Dropdownlist of presets   
    var winPreset =grp.add ("dropdownlist", undefined, [ "Description plates","Trapezes plates","-","Perso"]);
    winPreset.onChange = function ()
        switch (winPreset.selection.text)
                    case "Description plates":
                            textlimit.text=8;
                            textcolon.text=4;
                            Xspace.text=6.4;
                            Yspace.text=27;
                            textangle.text=0;
                            break;
                    case "Trapezes plates":
                            textlimit.text=18;
                            textcolon.text=6;
                            Xspace.text=9;
                            Yspace.text=9;
                            textangle.text=0;
                            break;
                    case "Perso":
                            textlimit.text=0;
                            textcolon.text=0;
                            Xspace.text=0;
                            Yspace.text=0;
                            textangle.text=0;
                            break;
    //winPreset.selection=1;
    var runBT=grp.add("button",undefined,"Run !");
    runBT.onClick = function()
        win.close();
        moteur();
    win.show();
    //--------------------End of UI CODE----------------
    //---------------------------------fonction  Placement of objects
    function place()
        var paddingx = parseFloat(Xspace.text)*2.834;        //spacing in mm between each column (for a value in points just suppress the *2.834)
        var paddingy = parseFloat(Yspace.text)*2.834;        //spacing in mm between each line
        var gridCols = textcolon.text;                            // number of columns
        var newGroup = doc.groupItems.add();
        var sel = doc.placedItems;
        // set the position of the first element, assuming that the group of all elements are centered  in X and Y  in the artboard
        var originX = (doc.width - ((doc.width - ((sel[0].width * gridCols) + (paddingx) * (gridCols-1)))/2))-sel[0].width
        var originY =((doc.height - (( sel[0].height * (textlimit.text/gridCols) ) +  (  paddingy*( (textlimit.text/gridCols)-1 )  )))/2)+sel[0].height
        var currentX= originX
        var currentY = originY
        for(var e=0, slen=sel.length;e<slen;e++)       
                //   :::SET POSITIONS:::
                sel[e].top = currentY;
                sel[e].left = currentX;
                //  :::DEFINE X POSITION:::
                currentX += -(sel[e].width + paddingx);
                if((e % gridCols) == (gridCols - 1))
                        currentX =  originX
                        //  :::DEFINE Y POSITION:::
                        currentY  += sel[e].height+paddingy;
                // ::Add to group
                sel[e].moveToBeginning (newGroup );
                redraw()
    //----------------------function Save
    function sauve()
        var fich =  txtbfn.text;    //Basename of the destination file
        // embed elements (for my case these are eps placeditem files)   
        for (var i = doc.placedItems.length-1; i >= 0; i-- )
                app.activeDocument.placedItems[i].embed();
        // draw a rectangle with the dimensions of the artboard and centered to it, with no fill color neither stroke color
        doc.rulerOrigin = [0,0];  // rulers to the origin
        var artboardRef = doc.artboards[0];
        // read dimensions oh the artboard to position therectangle
        var top=artboardRef.artboardRect[1] ;
        var left=artboardRef.artboardRect[0];
        var width=artboardRef.artboardRect[2]-artboardRef.artboardRect[0];
        var height=artboardRef.artboardRect[1]-artboardRef.artboardRect[3];
        var rect = doc.pathItems.rectangle (top, left, width, height);   
        rect.stroked = false;
        rect.filled = false;
        countName ++;
        // when several files are saved, the ten first files are numbered like this : 01, 02, 03... instead of 1,2,3
        var countName2 = countName;
        if (countName<=9) { countName2 = ("0" + countName)};
        if (xtimes != 0) // saves in eps, basename of file + number of times to repeat if necessary (it's to avoid to save several but identical files. For ex. if i have an object to print 100 times and i place 50 objects per file, the mention "2 times" will be mentionned in the name of the destination file )
                var dest= new File(folder + '/' + fich + ' ' + countName2 + ' - ' + xtimes + ' times' + '.eps');
        else
                var dest= new File(folder+ '/' + fich + ' ' + countName2 + '.eps') ;
        var options = new EPSSaveOptions();
        options.preview  = EPSPreview.None;
        //options.compatibility = Compatibility.ILLUSTRATOR14;
        //options.overprint = PDFOverprint.DISCARDPDFOVERPRINT
        //options.embedAllFonts = false;
        //options.includeDocumentThumbnails = false
        doc.saveAs(dest, options);
    //-------------------- function moteur
    function moteur()
        var limite = textlimit.text;            // max number of objects to distribute in one sheet
        var couchangl = textangle.text;    // rotation angle of the element
        //--------------Searches and signals if there is missing files in the source folder. If so, the script stops and displays which files are missing
        var miss=new Array();
        for (var i=0,len1=listEx.length;i<len1;i++)
            var myfile = new File(folder2+'/'+listEx[i]);
            if (myfile.exists==false)
                    miss.push(listEx[i]);
        if (miss.length != 0)
                alert (miss.length+" missing files : "+"\r"+miss.join(", "+"\r")+"\r"+"\r"+" Please correct and try again");
                return;
        //--------------end of  verification
    var start = new Date();        // starts chrono
    countName = textcount.text;    // start of the counter to number the name of the file to save
        //-------------disctribution of the object on the sheet
        for (var i=0,howmuch = 0,len1=listEx.length;i<len1;i++)
            for (var j =0; j<listqte[i];j++)
                    if (howmuch==0)
                            if ((listqte[i]-j)/limite>=2) //activate "xtimes" if quantity is twice or more bigger than "limit"
                                    xtimes = parseInt ((listqte[i]-j)/limite);
                                    j += limite*(xtimes-1);
                    myfile = new File(folder2+'/'+listEx[i]);
                    var  thisPlacedItem = doc.placedItems.add();
                    thisPlacedItem.file = myfile;
                    // rotate if necessary
                    if (couchangl !=0) thisPlacedItem.rotate(couchangl);
                    howmuch ++;
                    if (howmuch == limite)
                            place();
                            sauve();
                            doc.pageItems.removeAll();
                            howmuch = 0;
                            xtimes = 0;
    place();
    sauve();
    redraw();
    alert("time spent : "+((new Date() - start)/1000)+" secondes");

    Hello,
    The Windows Desktop Perfmon and Diagnostic tools forum is to discuss performance monitor (perfmon), resource monitor (resmon), and task manager, focusing on HOW-TO, Errors/Problems, and usage scenarios.
    As the question is off topic here, I am moving it to the
    Where is the Forum... forum.
    Karl
    When you see answers and helpful posts, please click Vote As Helpful, Propose As Answer, and/or Mark As Answer.
    My Blog: Unlock PowerShell
    My Book:
    Windows PowerShell 2.0 Bible
    My E-mail: -join ('6F6C646B61726C406F75746C6F6F6B2E636F6D'-split'(?<=\G.{2})'|%{if($_){[char][int]"0x$_"}})

  • Importing multiple Word docs into InDesign

    Hi there
    Is it possible to import multiple Word documents into a single InDesign text frame all at once?
    I have 20 files that all flow sequentially so was wondering if -- by selecting them all in Place window -- they would all be brought in one after the other, without each one creating its own new text frame.
    Any help gratefully received.
    Thanks
    Dan

    I use the script, below, for that. It's a bit scruffy, it should be tarted up. But it works fine. When you start it you type a path/file mask, using the formats illustrated in the dialog.
    It sets a few import preferences, these are the only ones I'm interested in. But it'll pick up the other options from their current settings.
    Peter
    // Description: Place multiple textfiles as one story
    #target indesign
    preset = '/d/test/*.rtf';
    app.wordRTFImportPreferences.useTypographersQuotes = true;
    app.wordRTFImportPreferences.convertPageBreaks = ConvertPageBreaks.none;
    app.wordRTFImportPreferences.importEndnotes = true;
    app.wordRTFImportPreferences.importFootnotes = true;
    app.wordRTFImportPreferences.importIndex = true;
    app.wordRTFImportPreferences.importTOC = false;
    app.wordRTFImportPreferences.importUnusedStyles = false;
    mask = prompt ('Enter a file path/mask.\r\r' +
        'Examples:\r' +
        'd:\\books\\test\\*.rtf   /d/books/test/*.rtf', preset);
    if (mask == null) exit();  // Cancel pressed
    ff = Folder (File (mask).path).getFiles (File (mask).name);
    if (ff.length > 0)
        placed = [];
        missed = [];
        tframe = app.documents.add().textFrames.add({geometricBounds : [36, 36, 400, 400]});
        placedstory = tframe.parentStory;
        app.scriptPreferences.userInteractionLevel =
            UserInteractionLevels.neverInteract;
        pb = initprogressbar (ff.length, 'Loading');
        for (i = 0; i < ff.length; i++)
            pb.value = i;
            try
                placedstory.insertionPoints[-1].place (ff[i]);
                placedstory.insertionPoints[-1].contents = '\r\r';
                placed.push (ff[i].name);
            catch (_)
                missed.push( ff[i].name );
        app.scriptPreferences.userInteractionLevel =
            UserInteractionLevels.interactWithAll;
        inform = '';
        if (placed.length > 0)
            inform = 'Placed ' + ff.length + ' files (in this order):\r\r' + placed.join ('\r');
        if (missed.length > 0)
            inform += '\r\rCould not place:\r\r' + missed.join ('\r');
        delete_empty_frames ();
        alert( inform );
    else
        alert (mask + ' not found.');
    // End
    function delete_empty_frames ()
        app.findGrepPreferences = app.changeGrepPreferences = null;
        app.findGrepPreferences.findWhat = '\\A\\Z';
        var empties = app.activeDocument.findGrep (true);
        for (var i = 0; i < empties.length; i++)
            empties[i].parentTextFrames[0].remove()
    function initprogressbar (stop, title)
        progresswindow = new Window('palette', title);
        progressbar = progresswindow.add ('progressbar', undefined, 1, stop);
        progressbar.preferredSize = [200,20];
        progresswindow.show ()
        return progressbar;

  • Problem creating hierarchy based on 2 physical dimension tables

    I'm having a problem creating 1 logical dimension with a drill-down hierarchy, based on two separate physical dimension tables. The errors I receive when navigating the drill-down hierarchy is:
    "Cannot find logical table source coverage for logical columns" &
    "Missing join between logical tables".
    I'm using OBIEE 10.1.3.4
    Here are the details of what I have setup sofar:
    Physical layer:
    Dimension table DIM_ORG with columns:
    -dimension_key
    -org_total_code
    -org_total_description
    -org_detail_code
    -org_detail_description
    Dimension table DIM_DEPT with columns:
    -dimension_key
    -dept_total_code
    -dept_total_description
    -dept_detail_code
    -dept_detail_description
    Fact table FACT_SALES with columns:
    -fk_org
    -fk_dept
    -sum_sales
    Physical Joins:
    FACT_SALES.fk_org = DIM_ORG_dimension_key
    FACT_SALES.fl_dept = DIM_DEPT.dimension_key
    Business Model & Mapping layer:
    I created a logical dimension ORG_DEPT. It contains two logical table sources (DIM_ORG & DIM_DEPT) and the following logical columns:
    - All Departments (mapped to dept_total_code)
    - Organisation (mapped to org_detail_description)
    - Organisation Number (mapped to org_detail_code)
    - Department (mapped to dept_detail_description)
    - Department Code (mapped to dept_detail_code)
    The business logical key is based on the combination of Organisation Number & Department Code
    The hierarchy I need is: All Departments -> Organisation -> Department so I created the following hierarchy for ORG_DEPT:
    - Total Level containing: All Departments
    - Organisation Level containing: Organisation Number (defined as the Logical level key) & Organisation (defined als the Drill level key)
    - Detail Department Level containing: Department Code (defined as Logical level key) and Department (defined as Drill level key).
    In the LTS of the dimension ORG_DEPT I've set the Content levels for the sources:
    DIM_ORG : Organisation Level
    DIM_DEPT: Detail Department Level
    In the LTS no -inner- joins have been added against related physical tables.
    I created a logical fact table SALES (based on the physical fact table) and joined it against the logical dimension table ORG_DEPT.
    In the LTS the Content level for ORG_DEPT is set against the Detail Department Level. No - inner- joins have been aded against related physical tables.
    When I create a report in Answers to test the hierachy and select only 'All Departments' I get the correct dimension value returned. When I try to drill to the next level I get the following ODBC error:
    "Cannot find logical table source coverage for logical columns: [All Departments]. Please check more detailed level keys are mapped correctly".
    When I create a report in Answers and select both 'All Departments' and 'Sales' I get the correct result. When I try to drill to the next level I get a different ODBC error:
    "Missing join between logical tables DIM_DEPT and DIM_DEPT: There must be at least one physical join link between the underlying physical tables".
    Any suggestions are welcome!
    Thanks!

    Hello Robert,
    Your suggestions were known to me but I still wanted to combine the two physical dimension tables in one logical dimension. So I've played around a bit more and found the solution: In my original setup I had two seperate logical table sources (one for each physical dimension table). The solution was to combine the two logical table sources in one logical table source. I achieved that by logical joining the DIM_DEPT table to the FACT_SALES table and subsequently to the DIM_ORG within the 1 LTS and using inner joins.
    Then I created the logical table key (a combination of org_detail_code & dept_detail_code). After that I could create the hierarchy with no problem.
    Edited by: The_Dutchman on Nov 4, 2011 9:43 PM

  • Importing and flowing multiple text docs into InDesign CS3

    I have multiple plain text files where each runs several pages long that I want to import into one document in ID CS3. I want to import them and have them flow in a single threaded text frame one after another over multiple pages. With a single multi-page text doc all I have to do is select Place and hold down the shift key and InDesign will add the necessary pages and flow the copy until the end of the doc. However, if I shift select the docs and try import them into a text frame by holding down the shift key, it will just flow the first doc in the group with no indication of overset text. I have tried placing multiple text docs holding down the shift and command key and that brings in all my docs on the first page but in separate text boxes with overset text for each doc. Is there a way to do this in InDesign or perhaps a plugin that can do this?
    Thanks
    Randy

    I tried to find this. It was posted 4/21/08 by Peter Kahrel (I can tell, because I can see my side of the discussion in my Sent folder) in response to a post I made entitled "Multiple Files". Maybe I'm not searching the forum archives properly, or maybe this was during the time last year when Adobe was trying (and failing) to update the forums. In any case, I'm sure at this point that Peter posted this for public consumption, so I don't think he's going to mind if I post it again:
    // Description: Place multiple textfiles as one story
    #target indesign
    preset = "/d/books/test/*.doc";
    app.wordRTFImportPreferences.useTypographersQuotes = false;
    app.wordRTFImportPreferences.convertPageBreaks = ConvertPageBreaks.none;
    app.wordRTFImportPreferences.importEndnotes = true;
    app.wordRTFImportPreferences.importFootnotes = true;
    app.wordRTFImportPreferences.importIndex = true;
    app.wordRTFImportPreferences.importTOC = false;
    app.wordRTFImportPreferences.importUnusedStyles = false;
    mask = prompt( 'Enter a file path/mask.\r\r' +
       'Examples:\r' +
       'd:\\books\\test\\*.rtf   /d/books/test/*.rtf', preset );
    if( mask == null ) exit();  // Cancel pressed
    ff = Folder( File(mask).path ).getFiles( File(mask).name );
    if( ff.length > 0 )
       placed = [];
       missed = [];
       tframe = app.documents.add().textFrames.add(
          { geometricBounds : [36, 36, 400, 400] } );
       placedstory = tframe.parentStory;
       app.scriptPreferences.userInteractionLevel = 
          UserInteractionLevels.neverInteract;
       pb = initprogressbar( ff.length, 'Loading');
       for( i = 0; i < ff.length; i++ )
          pb.value = i;
          try
             placedstory.insertionPoints[-1].contents = '£0';
             placedstory.insertionPoints[-1].place( ff[i] );
             placedstory.insertionPoints[-1].contents = '\r\r';
             placed.push( ff[i].name );
          catch(_)
             missed.push( ff[i].name );
       app.scriptPreferences.userInteractionLevel = 
          UserInteractionLevels.interactWithAll;
       inform = '';
       if( placed.length > 0 )
          inform = 'Placed ' + ff.length + ' files (in this order):\r\r' + placed.join('\r');
       if( missed.length > 0 )
          inform += '\r\rCould not place:\r\r' + missed.join('\r');
       delete_empty_frames ();
       alert( inform );
    else
       alert( mask + ' not found.' );
    // End
    function delete_empty_frames ()
       app.findGrepPreferences = app.changeGrepPreferences = null;
       app.findGrepPreferences.findWhat = '\\A\\Z';
       var empties = app.activeDocument.findGrep (true);
       for (var i = 0; i < empties.length; i++)
          empties[i].parentTextFrames[0].remove()
    function initprogressbar( stop, title)
       var progresswindow = new Window('palette', title);
       var progressbar = progresswindow.add( 'progressbar', undefined, 1, stop );
       progressbar.preferredSize = [200,20];
       progresswindow.show()
       return progressbar;
    Copy and paste everything between the hyphen lines (not including the hyphen lines) into a text editor and save with a .js extension and put it in your scripts folder. Should be something like:
    D:\Program Files\Adobe\InDesign CS3\Adobe InDesign CS3\Scripts\Scripts Panel
    After alphabetizing your files and putting them in their own folder, copy the path and run the script. It will make a new folder and place all your files in one continuous story. I don't know how it will work with .txt files.
    Ken Benson

Maybe you are looking for